summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWalter de Jong <walter@heiho.net>2013-03-29 09:55:56 +0100
committerWalter de Jong <walter@heiho.net>2013-03-29 09:55:56 +0100
commit6558af60d2b4569aa71d2fe425161e0ac8509dec (patch)
tree85b7914a8f4e2df4ec1dd861228f54d8c98f05a4
parentf663d6e0e8b5aa16009610b429499671bf8f4cc9 (diff)
downloadpam_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.c44
1 files changed, 20 insertions, 24 deletions
diff --git a/support.c b/support.c
index 7ee2dad..fe084cf 100644
--- a/support.c
+++ b/support.c
@@ -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) {