Make sure secrets file is not other-accessible, and owned by root if the
[rsync/rsync.git] / util.c
diff --git a/util.c b/util.c
index 8c352b2..7a4fbb8 100644 (file)
--- a/util.c
+++ b/util.c
@@ -358,31 +358,6 @@ void kill_all(int sig)
        }
 }
 
-/* like strncpy but does not 0 fill the buffer and always null 
-   terminates (thus it can use maxlen+1 space in d) */
-void strlcpy(char *d, char *s, int maxlen)
-{
-       int len = strlen(s);
-       if (len > maxlen) len = maxlen;
-       memcpy(d, s, len);
-       d[len] = 0;
-}
-
-/* like strncat but does not 0 fill the buffer and always null 
-   terminates (thus it can use maxlen+1 space in d) */
-void strlcat(char *d, char *s, int maxlen)
-{
-       int len1 = strlen(d);
-       int len2 = strlen(s);
-       if (len1+len2 > maxlen) {
-               len2 = maxlen-len1;
-       }
-       if (len2 > 0) {
-               memcpy(d+len1, s, len2);
-               d[len1+len2] = 0;
-       }
-}
-
 /* turn a user name into a uid */
 int name_to_uid(char *name, uid_t *uid)
 {
@@ -425,7 +400,7 @@ int lock_range(int fd, int offset, int len)
 }
 
 
-static void glob_expand_one(char *s, char **argv, int *argc, int maxargs)
+static void glob_expand_one(char *s, char **argv, int *argc, int maxargs, int sanitize_paths)
 {
 #if !(defined(HAVE_GLOB) && defined(HAVE_GLOB_H))
        if (!*s) s = ".";
@@ -438,7 +413,7 @@ static void glob_expand_one(char *s, char **argv, int *argc, int maxargs)
 
        if (!*s) s = ".";
 
-       argv[*argc] = strdup(s);
+       argv[*argc] = sanitize_paths ? sanitize_path(s) : strdup(s);
 
        memset(&globbuf, 0, sizeof(globbuf));
        glob(argv[*argc], 0, NULL, &globbuf);
@@ -457,7 +432,7 @@ static void glob_expand_one(char *s, char **argv, int *argc, int maxargs)
 #endif
 }
 
-void glob_expand(char *base1, char **argv, int *argc, int maxargs)
+void glob_expand(char *base1, char **argv, int *argc, int maxargs, int sanitize_paths)
 {
        char *s = argv[*argc];
        char *p, *q;
@@ -481,11 +456,11 @@ void glob_expand(char *base1, char **argv, int *argc, int maxargs)
        while ((p = strstr(q,base)) && ((*argc) < maxargs)) {
                /* split it at this point */
                *p = 0;
-               glob_expand_one(q, argv, argc, maxargs);
+               glob_expand_one(q, argv, argc, maxargs, sanitize_paths);
                q = p+strlen(base);
        }
 
-       if (*q && (*argc < maxargs)) glob_expand_one(q, argv, argc, maxargs);
+       if (*q && (*argc < maxargs)) glob_expand_one(q, argv, argc, maxargs, sanitize_paths);
 
        free(s);
        free(base);
@@ -502,14 +477,13 @@ void strlower(char *s)
        }
 }
 
-/* this is like vsnprintf but the 'n' limit does not include
-   the terminating null. So if you have a 1024 byte buffer then
-   pass 1023 for n */
+/* this is like vsnprintf but it always null terminates, so you
+   can fit at most n-1 chars in */
 int vslprintf(char *str, int n, const char *format, va_list ap)
 {
        int ret = vsnprintf(str, n, format, ap);
-       if (ret > n || ret < 0) {
-               str[n] = 0;
+       if (ret >= n || ret < 0) {
+               str[n-1] = 0;
                return -1;
        }
        str[ret] = 0;
@@ -670,10 +644,10 @@ char *push_dir(char *dir, int save)
        }
 
        if (*dir == '/') {
-               strlcpy(curr_dir, dir, sizeof(curr_dir)-1);
+               strlcpy(curr_dir, dir, sizeof(curr_dir));
        } else {
-               strlcat(curr_dir,"/", sizeof(curr_dir)-1);
-               strlcat(curr_dir,dir, sizeof(curr_dir)-1);
+               strlcat(curr_dir,"/", sizeof(curr_dir));
+               strlcat(curr_dir,dir, sizeof(curr_dir));
        }
 
        clean_fname(curr_dir);
@@ -692,7 +666,7 @@ int pop_dir(char *dir)
                return ret;
        }
 
-       strlcpy(curr_dir, dir, sizeof(curr_dir)-1);
+       strlcpy(curr_dir, dir, sizeof(curr_dir));
 
        free(dir);
 
@@ -703,8 +677,8 @@ int pop_dir(char *dir)
    to ensure that signed/unsigned usage is consistent between machines. */
 int u_strcmp(const char *cs1, const char *cs2)
 {
-       const uchar *s1 = (uchar *)cs1;
-       const uchar *s2 = (uchar *)cs2;
+       const uchar *s1 = (const uchar *)cs1;
+       const uchar *s2 = (const uchar *)cs2;
 
        while (*s1 && *s2 && (*s1 == *s2)) {
                s1++; s2++;
@@ -797,7 +771,7 @@ char *timestring(time_t t)
 #ifdef HAVE_STRFTIME
        strftime(TimeBuf,sizeof(TimeBuf)-1,"%Y/%m/%d %T",tm);
 #else
-       strlcpy(TimeBuf, asctime(tm), sizeof(TimeBuf)-1);
+       strlcpy(TimeBuf, asctime(tm), sizeof(TimeBuf));
 #endif
 
        if (TimeBuf[strlen(TimeBuf)-1] == '\n') {