summaryrefslogtreecommitdiffstats
path: root/utils
diff options
context:
space:
mode:
authorLuk Claes <luk@debian.org>2011-07-12 10:38:03 -0400
committerSteve Dickson <steved@redhat.com>2011-07-12 10:39:02 -0400
commit0062bea7159b3c7516d4d361ef1244d727231936 (patch)
treea1e35259477521fffe7a8bb343d3a1abf1a7672b /utils
parentc4c6126f05713afe46c0e99647d7a07dd1fc2ebb (diff)
downloadnfs-utils-0062bea7159b3c7516d4d361ef1244d727231936.tar.gz
nfs-utils-0062bea7159b3c7516d4d361ef1244d727231936.tar.xz
nfs-utils-0062bea7159b3c7516d4d361ef1244d727231936.zip
mount.nfs: Do not segfault because of kernel version
mount.nfs segfaults if kernel version number does not contain at least 3 components delimited with a dot. Avoid this by matching up to three unsigned integers inialised to zero, separated by dots. A version that does not start with an integer is probably a future version where the versioning evolved to another scheme. Return UINT_MAX which is guaranteed to be higher than existing versions. This would also make it possible to easily identify versions that do not start with an integer. Signed-off-by: Luk Claes <luk@debian.org> Signed-off-by: Steve Dickson <steved@redhat.com>
Diffstat (limited to 'utils')
-rw-r--r--utils/mount/version.h16
1 files changed, 9 insertions, 7 deletions
diff --git a/utils/mount/version.h b/utils/mount/version.h
index af61a6f..531cf68 100644
--- a/utils/mount/version.h
+++ b/utils/mount/version.h
@@ -23,8 +23,8 @@
#ifndef _NFS_UTILS_MOUNT_VERSION_H
#define _NFS_UTILS_MOUNT_VERSION_H
-#include <stdlib.h>
-#include <string.h>
+#include <stdio.h>
+#include <limits.h>
#include <sys/utsname.h>
@@ -37,14 +37,16 @@ static inline unsigned int MAKE_VERSION(unsigned int p, unsigned int q,
static inline unsigned int linux_version_code(void)
{
struct utsname my_utsname;
- unsigned int p, q, r;
+ unsigned int p, q = 0, r = 0;
+ /* UINT_MAX as backward compatibility code should not be run */
if (uname(&my_utsname))
- return 0;
+ return UINT_MAX;
- p = (unsigned int)atoi(strtok(my_utsname.release, "."));
- q = (unsigned int)atoi(strtok(NULL, "."));
- r = (unsigned int)atoi(strtok(NULL, "."));
+ /* UINT_MAX as future versions might not start with an integer */
+ if (sscanf(my_utsname.release, "%u.%u.%u", &p, &q, &r) < 1)
+ return UINT_MAX;
+
return MAKE_VERSION(p, q, r);
}