Bump sys_errlist size to keep ABI backward-compatible for some time.

Addition of the new errno values requires adding new elements to
sys_errlist array, which is actually ABI-incompatible, since ELF
records the object size.  Expand array in advance to 150 elements so
that we have our users to go over the issue only once, at least until
more than 53 new errors are added.

I did not bumped the symbol version, same as it was not done for
previous increases of the array size.  Runtime linker only copies as
much data into binary object on copy relocation as the binary'object
specifies.  This is not fixable for binaries which access sys_errlist
directly.

While there, correct comment and calculation of the temporary buffer
size for the message printed for unknown error.  The on-stack buffer
is used only for the number and delimiter since r108603.

Requested by:	mckusick
Reviewed by:	mckusick, yuripv
MFC after:	2 weeks
Sponsored by:	The FreeBSD Foundation
Differential revision:	https://reviews.freebsd.org/D18656
This commit is contained in:
Konstantin Belousov 2018-12-27 13:02:15 +00:00
parent 2cb73efc0d
commit cd49e866fc
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=342551
3 changed files with 71 additions and 10 deletions

View file

@ -33,9 +33,12 @@
__SCCSID("@(#)errlst.c 8.2 (Berkeley) 11/16/93");
__FBSDID("$FreeBSD$");
#include <errno.h>
#include <stdio.h>
#include "errlst.h"
const char __uprefix[] = "Unknown error";
const char *const sys_errlist[] = {
"No error: 0", /* 0 - ENOERROR */
"Operation not permitted", /* 1 - EPERM */
@ -155,8 +158,67 @@ const char *const sys_errlist[] = {
"Not permitted in capability mode", /* 94 - ECAPMODE */
"State not recoverable", /* 95 - ENOTRECOVERABLE */
"Previous owner died", /* 96 - EOWNERDEAD */
/*
* Reserved space in sys_errlist, take the next slot for a next error code.
* Reserve prevents the array size from changing for some time.
*/
__uprefix, /* 97 */
__uprefix, /* 98 */
__uprefix, /* 99 */
__uprefix, /* 100 */
__uprefix, /* 101 */
__uprefix, /* 102 */
__uprefix, /* 103 */
__uprefix, /* 104 */
__uprefix, /* 105 */
__uprefix, /* 106 */
__uprefix, /* 107 */
__uprefix, /* 108 */
__uprefix, /* 109 */
__uprefix, /* 110 */
__uprefix, /* 111 */
__uprefix, /* 112 */
__uprefix, /* 113 */
__uprefix, /* 114 */
__uprefix, /* 115 */
__uprefix, /* 116 */
__uprefix, /* 117 */
__uprefix, /* 118 */
__uprefix, /* 119 */
__uprefix, /* 120 */
__uprefix, /* 121 */
__uprefix, /* 122 */
__uprefix, /* 123 */
__uprefix, /* 124 */
__uprefix, /* 125 */
__uprefix, /* 126 */
__uprefix, /* 127 */
__uprefix, /* 128 */
__uprefix, /* 129 */
__uprefix, /* 130 */
__uprefix, /* 131 */
__uprefix, /* 132 */
__uprefix, /* 133 */
__uprefix, /* 134 */
__uprefix, /* 135 */
__uprefix, /* 136 */
__uprefix, /* 137 */
__uprefix, /* 138 */
__uprefix, /* 139 */
__uprefix, /* 140 */
__uprefix, /* 141 */
__uprefix, /* 142 */
__uprefix, /* 143 */
__uprefix, /* 144 */
__uprefix, /* 145 */
__uprefix, /* 146 */
__uprefix, /* 147 */
__uprefix, /* 148 */
__uprefix, /* 149 */
__uprefix, /* 150 */
};
const int sys_nerr = sizeof(sys_errlist) / sizeof(sys_errlist[0]);
const int sys_nerr = ELAST + 1;
#ifdef PIC
__strong_reference(sys_errlist, __hidden_sys_errlist);

View file

@ -42,4 +42,6 @@ extern const int __hidden_sys_nerr __hidden;
#define __hidden_sys_nerr sys_nerr
#endif
extern const char __uprefix[] __hidden;
#endif /* __ERRLST_H__ */

View file

@ -46,15 +46,12 @@ __FBSDID("$FreeBSD$");
#include "errlst.h"
#define UPREFIX "Unknown error"
/*
* Define a buffer size big enough to describe a 64-bit signed integer
* converted to ASCII decimal (19 bytes), with an optional leading sign
* (1 byte); finally, we get the prefix, delimiter (": ") and a trailing
* NUL from UPREFIX.
* Define buffer big enough to contain delimiter (": ", 2 bytes),
* 64-bit signed integer converted to ASCII decimal (19 bytes) with
* optional leading sign (1 byte), and a trailing NUL.
*/
#define EBUFSIZE (20 + 2 + sizeof(UPREFIX))
#define EBUFSIZE (2 + 19 + 1 + 1)
/*
* Doing this by hand instead of linking with stdio(3) avoids bloat for
@ -94,9 +91,9 @@ strerror_r(int errnum, char *strerrbuf, size_t buflen)
if (errnum < 0 || errnum >= __hidden_sys_nerr) {
errstr(errnum,
#if defined(NLS)
catgets(catd, 1, 0xffff, UPREFIX),
catgets(catd, 1, 0xffff, __uprefix),
#else
UPREFIX,
__uprefix,
#endif
strerrbuf, buflen);
retval = EINVAL;