Introduction
Introduction Statistics Contact Development Disclaimer Help
Don't truncate silently in snprintf(). - susmb - mounting of SMB/CIFS shares vi…
git clone git://git.codemadness.org/susmb
Log
Files
Refs
README
LICENSE
---
commit 64313aed26f8c03e48d817d01affe47eb2df5a1e
parent fdd9015111ff8fcb39d85d25250d14b1d532e44f
Author: Geoff Johnstone <[email protected]>
Date: Sat, 13 Mar 2010 13:29:26 +0000
Don't truncate silently in snprintf().
Diffstat:
M conffile.c | 9 ++++++---
M usmb.c | 25 ++++++++++++++++++++++---
M utils.c | 31 +++++++++++++++++++++++++++++…
M utils.h | 7 +++++++
4 files changed, 65 insertions(+), 7 deletions(-)
---
diff --git a/conffile.c b/conffile.c
@@ -111,8 +111,11 @@ static bool do_xpath_text (xmlXPathContextPtr ctx,
const char *child, char **out)
{
char xpath[2048];
- snprintf (xpath, sizeof (xpath),
- "/usmbconfig/%s[@id='%s']/%s/text()", parent, id, child);
+
+ if (!bsnprintf (xpath, sizeof (xpath),
+ "/usmbconfig/%s[@id='%s']/%s/text()", parent, id, child))
+ return false;
+
return xml_xpath_text (ctx, xpath, (void *)out);
}
@@ -146,7 +149,7 @@ bool conffile_get_mount (const char *filename, const char *…
if (!do_xpath_text (ctx, "mount", key, "mountpoint", mountpoint)) break;
(void)do_xpath_text (ctx, "mount", key, "options", options);
- snprintf (xp, sizeof (xp), "/usmbconfig/mount[@id='%s']", key);
+ if (!snprintf (xp, sizeof (xp), "/usmbconfig/mount[@id='%s']", key)) break;
if (!xml_xpath_attr_value (ctx, xp, "credentials", &creds)) break;
(void)do_xpath_text (ctx, "credentials", creds, "domain", domain);
diff --git a/usmb.c b/usmb.c
@@ -21,6 +21,7 @@
#include "samba3x-compat.h"
#include <fuse.h>
#include <assert.h>
+#include <limits.h>
#include <errno.h>
#include <stdarg.h>
#include <stdbool.h>
@@ -190,7 +191,13 @@ static bool create_share_name (const char *server_, const …
return false;
}
- snprintf (share, len, "smb://%s/%s", server_, sharename);
+ if (!bsnprintf (share, len, "smb://%s/%s", server_, sharename))
+ {
+ fputs ("Share server and/or name are too long.\n", stderr);
+ free (share);
+ return false;
+ }
+
DEBUG (fprintf (stderr, "Share URL: %s\n", share));
return true;
}
@@ -276,8 +283,20 @@ int main (int argc, char **argv)
}
{
- static char conf[256];
- snprintf (conf, sizeof (conf), "%s/.usmb.conf", getenv ("HOME"));
+ static char conf[PATH_MAX];
+ const char * const HOME = getenv ("HOME");
+ if (NULL == HOME)
+ {
+ fputs ("Please set the HOME environment variable.\n", stderr);
+ return EXIT_FAILURE;
+ }
+
+ if (!bsnprintf (conf, sizeof (conf), "%s/.usmb.conf", HOME))
+ {
+ fputs ("Configuration file path is too long.\n", stderr);
+ return EXIT_FAILURE;
+ }
+
conffile = conf;
}
diff --git a/utils.c b/utils.c
@@ -1,5 +1,5 @@
/* usmb - mount SMB shares via FUSE and Samba
- * Copyright (C) 2006-2009 Geoff Johnstone
+ * Copyright (C) 2006-2010 Geoff Johnstone
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 3 as
@@ -140,3 +140,32 @@ void xfree_errno (const void *ptr)
errno = err;
}
+
+bool bsnprintf (char *str, size_t size, const char *format, ...)
+{
+ va_list ap;
+ bool ret;
+
+ assert (str);
+ assert (format);
+
+ va_start (ap, format);
+ ret = bvsnprintf (str, size, format, ap);
+ va_end (ap);
+
+ return ret;
+}
+
+
+bool bvsnprintf (char *str, size_t size, const char *format, va_list ap)
+{
+ int ret;
+
+ assert (str);
+ assert (format);
+
+ ret = vsnprintf (str, size, format, ap);
+
+ return ((ret >= 0) && ((size_t)ret < size));
+}
+
diff --git a/utils.h b/utils.h
@@ -17,6 +17,10 @@
#ifndef UTILS_H
#define UTILS_H
+ #include <stdarg.h>
+ #include <stdbool.h>
+ #include <stddef.h>
+
#ifdef DEBUG
#undef DEBUG
#define DEBUG(x) (x)
@@ -31,5 +35,8 @@
void clear_and_free (char *ptr);
void free_errno (const void *ptr);
void xfree_errno (const void *ptr);
+ bool bsnprintf (char *str, size_t size, const char *format, ...)
+ __attribute__ ((format (printf, 3, 4)));
+ bool bvsnprintf (char *str, size_t size, const char *format, va_list ap);
#endif
You are viewing proxied material from codemadness.org. The copyright of proxied material belongs to its original authors. Any comments or complaints in relation to proxied material should be directed to the original authors of the content concerned. Please see the disclaimer for more details.