added lenght check in strerror handling
Some checks failed
continuous-integration/drone/push Build is failing

This commit is contained in:
hyung-hwan 2024-02-16 09:32:51 +09:00
parent dc8f0102a8
commit dce2b4e040

View File

@ -904,23 +904,23 @@ static hcl_errnum_t _syserrstrb (hcl_t* hcl, int syserr_type, int syserr_code, h
case 0: case 0:
#if defined(_WIN32) && defined(__STDC_WANT_SECURE_LIB__) #if defined(_WIN32) && defined(__STDC_WANT_SECURE_LIB__)
if (buf) strerror_s (buf, len, syserr_code); if (buf && len > 0) strerror_s (buf, len, syserr_code);
#elif defined(HAVE_STRERROR_R) #elif defined(HAVE_STRERROR_R)
if (buf) if (buf && len > 0)
{ {
/* to work around mess between XSI and GNU strerror_r */ /* to work around mess between XSI and GNU strerror_r */
hcl_oow_t x; hcl_oow_t x;
if (len > 0) buf[0] = '\0'; buf[0] = '\0';
/* cast to hcl_oow_t to cater for prototype difference. /* cast to hcl_oow_t to cater for prototype difference.
* one returning int, the other returning a pointer. * one returning int, the other returning a pointer.
* x > 1024 in case the XSI version before glibc 2.13 returns * x > 1024 in case the XSI version before glibc 2.13 returns
* a positive error code upon failure */ * a positive error code upon failure */
x = (hcl_oow_t)strerror_r(syserr_code, buf, len); x = (hcl_oow_t)strerror_r(syserr_code, buf, len);
if (len > 0 && buf[0] == '\0' && x != 0 && x > 1024 && x != (hcl_oow_t)-1) hcl_copy_bcstr (buf, len, x); if (buf[0] == '\0' && x != 0 && x > 1024 && x != (hcl_oow_t)-1) hcl_copy_bcstr (buf, len, x);
} }
#else #else
/* this may be thread unsafe */ /* this may be thread unsafe */
if (buf) hcl_copy_bcstr (buf, len, strerror(syserr_code)); if (buf && len > 0) hcl_copy_bcstr (buf, len, strerror(syserr_code));
#endif #endif
return errno_to_errnum(syserr_code); return errno_to_errnum(syserr_code);
} }