Skip to contentSkip to conversation

xfsprogs: xfs_quota allow user or group names beginning with digits

PATCH Superseded [email protected] 3 participants 3 messages Apr 18, 2013 – Apr 22, 2013

v1 of 3 Superseded Latest is v3 →

lore
Share & tools
lore
#0 lore raw

PATCH 1/1 xfsprogs: xfs_quota allow user or group names beginning with digits

xfs_quota does not properly parse users or groups that begin with a number. Only call atoi when user or group consists of digits only.

---
 include/input.h |    1 +
 libxcmd/input.c |   12 ++++++++++++
 quota/quota.c   |    4 ++--
 quota/quota.h   |    1 +
 4 files changed, 16 insertions(+), 2 deletions(-)
include/input.h +1 -0
Index: b/include/input.h
===================================================================
@@ -46,6 +46,7 @@ extern void	timestr(struct timeval *tv,
 extern uid_t	uid_from_string(char *user);
 extern gid_t	gid_from_string(char *group);
 extern prid_t	prid_from_string(char *project);
+extern boolean_t isdigits_only(const char *str);
 
 #define HAVE_FTW_H 1	/* TODO: configure me */
 
libxcmd/input.c +12 -0
Index: b/libxcmd/input.c
===================================================================
@@ -398,6 +398,18 @@ gid_from_string(
 	return -1;
 }
 
+boolean_t isdigits_only(
+	const char *str)
+{
+	int i;
+
+	for (i=0; i < strlen(str); i++) {
+		if (!isdigit(str[i]))
+			return B_FALSE;
+	}
+	return B_TRUE;
+}
+
 #define HAVE_FTW_H 1	/* TODO: configure me */
 
 #ifndef HAVE_FTW_H
quota/quota.c +2 -2
Index: b/quota/quota.c
===================================================================
@@ -224,7 +224,7 @@ quota_user_type(
 	uid_t		id;
 
 	if (name) {
-		if (isdigit(name[0])) {
+		if (isdigits_only(name)) {
 			id = atoi(name);
 			name = getusername(id, flags & NO_LOOKUP_FLAG);
 		} else if ((u = getpwnam(name))) {
@@ -273,7 +273,7 @@ quota_group_type(
 	int		i, ngroups, dofree = 0;
 
 	if (name) {
-		if (isdigit(name[0])) {
+		if (isdigits_only(name)) {
 			gid = atoi(name);
 			name = getgroupname(gid, flags & NO_LOOKUP_FLAG);
 		} else {
quota/quota.h +1 -0
Index: b/quota/quota.h
===================================================================
@@ -80,4 +80,5 @@ enum {
 extern char *uid_to_name(__uint32_t __uid);
 extern char *gid_to_name(__uint32_t __gid);
 extern char *prid_to_name(__uint32_t __prid);
+extern boolean_t isdigits_only(const char *);
 

_______________________________________________
xfs mailing list
[email protected]
http://oss.sgi.com/mailman/listinfo/xfs

Reviewed-by on v1 1/1
#1 lore raw

On 4/17/13 1:32 PM, [email protected] wrote:

<some kind of email that doesn't show up when I hit reply so repasting ;)>

Quoted 6 lines

xfs_quota does not properly parse users or groups that begin with a number. Only call atoi when user or group consists of digits only.

Seems sane to me. I'd change i=0 to i = 0, but *shrug*

[xfsprogs]$ grep -r "i = 0" * | wc -l
404
[xfsprogs]$ grep -r "i=0" * | wc -l
10

Other than that,

Quoted 76 lines
---
 include/input.h |    1 +
 libxcmd/input.c |   12 ++++++++++++
 quota/quota.c   |    4 ++--
 quota/quota.h   |    1 +
 4 files changed, 16 insertions(+), 2 deletions(-)

Index: b/include/input.h
===================================================================

include/input.h +1 -0
@@ -46,6 +46,7 @@ extern void	timestr(struct timeval *tv,
 extern uid_t	uid_from_string(char *user);
 extern gid_t	gid_from_string(char *group);
 extern prid_t	prid_from_string(char *project);
+extern boolean_t isdigits_only(const char *str);
 
 #define HAVE_FTW_H 1	/* TODO: configure me */
 

Index: b/libxcmd/input.c
===================================================================

libxcmd/input.c +12 -0
@@ -398,6 +398,18 @@ gid_from_string(
 	return -1;
 }
 
+boolean_t isdigits_only(
+	const char *str)
+{
+	int i;
+
+	for (i=0; i < strlen(str); i++) {
+		if (!isdigit(str[i]))
+			return B_FALSE;
+	}
+	return B_TRUE;
+}
+
 #define HAVE_FTW_H 1	/* TODO: configure me */
 
 #ifndef HAVE_FTW_H

Index: b/quota/quota.c
===================================================================

quota/quota.c +2 -2
@@ -224,7 +224,7 @@ quota_user_type(
 	uid_t		id;
 
 	if (name) {
-		if (isdigit(name[0])) {
+		if (isdigits_only(name)) {
 			id = atoi(name);
 			name = getusername(id, flags & NO_LOOKUP_FLAG);
 		} else if ((u = getpwnam(name))) {
@@ -273,7 +273,7 @@ quota_group_type(
 	int		i, ngroups, dofree = 0;
 
 	if (name) {
-		if (isdigit(name[0])) {
+		if (isdigits_only(name)) {
 			gid = atoi(name);
 			name = getgroupname(gid, flags & NO_LOOKUP_FLAG);
 		} else {

Index: b/quota/quota.h
===================================================================

quota/quota.h +1 -0
@@ -80,4 +80,5 @@ enum {
 extern char *uid_to_name(__uint32_t __uid);
 extern char *gid_to_name(__uint32_t __gid);
 extern char *prid_to_name(__uint32_t __prid);
+extern boolean_t isdigits_only(const char *);
 
Quoted 5 lines

_______________________________________________
xfs mailing list
[email protected]
http://oss.sgi.com/mailman/listinfo/xfs

_______________________________________________
xfs mailing list
[email protected]
http://oss.sgi.com/mailman/listinfo/xfs

#2 lore raw
In reply to [email protected]
Quoted 17 lines · On Wed, Apr 17, 2013 at 01:32:53PM -0500, [email protected] wrote:

xfs_quota does not properly parse users or groups that begin with a number. Only call atoi when user or group consists of digits only.

---
 include/input.h |    1 +
 libxcmd/input.c |   12 ++++++++++++
 quota/quota.c   |    4 ++--
 quota/quota.h   |    1 +
 4 files changed, 16 insertions(+), 2 deletions(-)

Index: b/include/input.h
===================================================================

include/input.h extern void timestr(struct timeval *tv, · line 49

Quoted 4 lines
include/input.h +1 -0
@@ -46,6 +46,7 @@ extern void	timestr(struct timeval *tv,
 extern uid_t	uid_from_string(char *user);
 extern gid_t	gid_from_string(char *group);
 extern prid_t	prid_from_string(char *project);
+extern boolean_t isdigits_only(const char *str);

bool is the correct type, not boolean_t. My CRC patchset makes userspace fall in line with the removal of boolean_t from the kernel code, so we should probably make this correct from the start. ;)

Cheers,

Dave.

Signature · 7 lines
Dave Chinner
[email protected]

_______________________________________________
xfs mailing list
[email protected]
http://oss.sgi.com/mailman/listinfo/xfs