diff options
| author | Walter de Jong <walter@heiho.net> | 2013-03-29 09:55:56 +0100 |
|---|---|---|
| committer | Walter de Jong <walter@heiho.net> | 2013-03-29 09:55:56 +0100 |
| commit | 6558af60d2b4569aa71d2fe425161e0ac8509dec (patch) | |
| tree | 85b7914a8f4e2df4ec1dd861228f54d8c98f05a4 | |
| parent | f663d6e0e8b5aa16009610b429499671bf8f4cc9 (diff) | |
| download | pam_tacplus-6558af60d2b4569aa71d2fe425161e0ac8509dec.tar.gz pam_tacplus-6558af60d2b4569aa71d2fe425161e0ac8509dec.zip | |
xstrcpy() aborts on argument too long
Which may be dumb, but it's better than bluntly truncating a string
| -rw-r--r-- | support.c | 44 |
1 files changed, 20 insertions, 24 deletions
@@ -37,10 +37,22 @@ char tac_service[64]; char tac_protocol[64]; char tac_prompt[64]; +void _pam_log(int err, const char *format,...) { + char msg[256]; + va_list args; + + va_start(args, format); + vsnprintf(msg, sizeof(msg), format, args); + openlog("PAM-tacplus", LOG_PID, LOG_AUTH); + syslog(err, "%s", msg); + va_end(args); + closelog(); +} + /* - safe string copy, like strlcpy() really + safe string copy that aborts when destination buffer is too small */ -size_t xstrcpy(char *dst, const char *src, size_t dst_size) { +char *xstrcpy(char *dst, const char *src, size_t dst_size) { if (dst == NULL) _pam_log(LOG_ERR, "xstrcpy(): dst == NULL"); @@ -48,30 +60,14 @@ size_t xstrcpy(char *dst, const char *src, size_t dst_size) { _pam_log(LOG_ERR, "xstrcpy(): src == NULL"); if (!dst_size) - return 0; - - size_t s_len = strlen(src); + return NULL; - size_t n = s_len; - if (n >= dst_size) - n = dst_size - 1; + if (strlen(src) >= dst_size) { + _pam_log(LOG_ERR, "xstrcpy(): argument too long, aborting"); + abort(); + } - strncpy(dst, src, n); - dst[n] = 0; - - return n; -} - -void _pam_log(int err, const char *format,...) { - char msg[256]; - va_list args; - - va_start(args, format); - vsnprintf(msg, sizeof(msg), format, args); - openlog("PAM-tacplus", LOG_PID, LOG_AUTH); - syslog(err, "%s", msg); - va_end(args); - closelog(); + return strcpy(dst, src); } char *_pam_get_user(pam_handle_t *pamh) { |
