pt_util: gcc warning fix
[openafs.git] / src / ptserver / pt_util.c
index 2c52e42..2b6d35b 100644 (file)
@@ -44,6 +44,8 @@
 extern char *optarg;
 extern int optind;
 
+extern int pr_noAuth;
+
 int restricted = 0;
 
 static int display_entry(int);
@@ -147,6 +149,9 @@ CommandProc(struct cmd_syndesc *a_as, void *arock)
 
     if (tparm[0].items) {
        wflag++;
+       /* so we are treated as admin and can create "mis"owned
+          groups */
+       pr_noAuth = 1;
     }
     if (tparm[1].items) {
        flags |= DO_USR;
@@ -231,13 +236,26 @@ CommandProc(struct cmd_syndesc *a_as, void *arock)
 
     if (wflag) {
        struct usr_list *u;
+       int seenGroup = 0, id = 0, flags = 0;
 
        while (fgets(buffer, sizeof(buffer), dfp)) {
-           int id, oid, cid, flags, quota, uid;
+           int oid, cid, quota, uid;
            char name[PR_MAXNAMELEN], mem[PR_MAXNAMELEN];
 
            if (isspace(*buffer)) {
-               sscanf(buffer, "%s %d", mem, &uid);
+               code = sscanf(buffer, "%s %d", mem, &uid);
+               if (code != 2) {
+                   fprintf(stderr,
+                           "Insuffient data provided for group membership\n");
+                   exit(1);
+               }
+
+               if (!seenGroup) {
+                   fprintf(stderr,
+                           "Group member %s listed outside of group\n",
+                           mem);
+                   exit(1);
+               }
 
                for (u = usr_head; u; u = u->next)
                    if (u->uid && u->uid == uid)
@@ -287,8 +305,15 @@ CommandProc(struct cmd_syndesc *a_as, void *arock)
                    fprintf(stderr, "Error while adding %s to %s: %s\n", mem,
                            name, afs_error_message(code));
            } else {
-               sscanf(buffer, "%s %d/%d %d %d %d", name, &flags, &quota, &id,
-                      &oid, &cid);
+               code = sscanf(buffer, "%s %d/%d %d %d %d", name, &flags, &quota, &id,
+                             &oid, &cid);
+               if (code != 6) {
+                   fprintf(stderr,
+                           "Insufficient data provided for user/group\n");
+                   exit(1);
+               }
+
+               seenGroup = 1;
 
                if (FindByID(0, id))
                    code = PRIDEXIST;
@@ -296,7 +321,7 @@ CommandProc(struct cmd_syndesc *a_as, void *arock)
                    code = CreateEntry(0, name, &id, 1 /*idflag */ ,
                                       flags & PRGRP, oid, cid);
                if (code == PRBADNAM) {
-                   u = (struct usr_list *)malloc(sizeof(struct usr_list));
+                   u = malloc(sizeof(struct usr_list));
                    u->next = usr_head;
                    u->uid = id;
                    strcpy(u->name, name);
@@ -395,7 +420,7 @@ add_group(long id)
 
     i = grp_count++ % 1024;
     if (i == 0) {
-       g = (struct grp_list *)malloc(sizeof(struct grp_list));
+       g = malloc(sizeof(struct grp_list));
        g->next = grp_head;
        grp_head = g;
     }
@@ -562,7 +587,7 @@ checkin(struct prentry *pre)
        last = he;
        he = he->next;
     }
-    he = (struct hash_entry *)malloc(sizeof(struct hash_entry));
+    he = malloc(sizeof(struct hash_entry));
     if (he == 0) {
        fprintf(stderr, "pt_util: No Memory for internal hash table.\n");
        exit(1);