git.fiddlerwoaroof.com
Browse code

memory management improvements

Greg Wiley authored on 07/04/2017 22:09:49
Showing 1 changed files
... ...
@@ -39,85 +39,42 @@ size_t buffer_size(buffer_t buffer) {
39 39
 }
40 40
 
41 41
 
42
-int user_is_known(const char *user, buffer_t buffer) {
43
-    struct passwd *passwd = 0;
44
-    passwd = (struct passwd *) malloc(sizeof(struct passwd));
42
+int get_passwd(const char *user, struct passwd *passwd, buffer_t buffer) {
45 43
     struct passwd *found_passwd = 0;
46 44
     getpwnam_r(user, passwd, use_buffer(buffer), buffer_size(buffer), &found_passwd);
47
-    int known = found_passwd != 0;
48
-
49
-    free(passwd);
50
-
51
-    return known;
52
-
53
-}
54
-
55
-char *get_home_directory(const char *user, buffer_t buffer) {
56
-    struct passwd *passwd = 0;
57
-    passwd = (struct passwd *) malloc(sizeof(struct passwd));
58
-    struct passwd *found_passwd = 0;
59
-    getpwnam_r(user, passwd, use_buffer(buffer), buffer_size(buffer), &found_passwd);
60
-
61
-    free(passwd);
62
-
63
-    if (found_passwd) {
64
-        return found_passwd->pw_dir;
65
-    }
66
-
67
-    return 0;
45
+    return (found_passwd != 0);
68 46
 }
69 47
 
70 48
 int validate_token(const char *token) {
71 49
 
72
-    char *user = 0;
73
-    char *dup_token = 0;
74
-    struct stat *file_stat = 0;
75 50
     char *filepath = 0;
76
-
51
+    char *working_token = 0;
52
+    buffer_t buffer = allocate_buffer();
77 53
 
78 54
     int ok = 0;
79 55
 
80
-
81
-    // duplicate
82 56
     int token_length = strlen(token);
83
-    user = (char *) malloc((token_length + 1) * sizeof(char));
84
-    strcpy(user, token);
85
-
86
-    // find the first colon
87
-    char *colon = strchr(user, ':');
57
+    working_token = (char *) malloc((token_length + 1) * sizeof(char));
58
+    strcpy(working_token, token);
59
+    char *colon = strchr(working_token, ':');
88 60
     if (!colon) {
89 61
         goto finally;
90 62
     }
91 63
 
92
-    // poke a zero so dup is the username
93 64
     *colon = 0;
65
+    char *user = working_token;
66
+    char *user_token = colon + 1;
94 67
 
95
-    dup_token = (char *)malloc((token_length + 1) * sizeof(char));
96
-    strcpy(dup_token, token);
97
-    char *token_colon = strchr(dup_token, ':');
98
-    if (!token_colon) {
99
-       goto finally;
100
-    }
101
-
102
-     char *user_token = token_colon + 1;
103
-
68
+    struct passwd passwd;
69
+    int user_found = get_passwd(user, &passwd, buffer);
104 70
 
105 71
     // check if user is known
106
-    buffer_t user_buffer = allocate_buffer();
107
-    if(!user_is_known(user, user_buffer)) {
72
+    if(!user_found) {
108 73
        goto finally;
109 74
     }
110 75
 
111
-    // find the token for found user
112
-    buffer_t directory_buffer = allocate_buffer();
113
-    char *directory = get_home_directory(user, directory_buffer);
114
-    if (!directory) {
115
-        goto finally;
116
-    }
117
-
118
-    // stat
76
+    const char *directory = passwd.pw_dir;
119 77
 
120
-    file_stat = (struct stat *) malloc(sizeof(struct stat));
121 78
     int dir_len = strlen(directory);
122 79
     int fname_len = strlen(".dual_control");
123 80
     filepath = (char *)malloc((dir_len + 1 + fname_len + 1) * sizeof(char));
... ...
@@ -126,12 +83,12 @@ int validate_token(const char *token) {
126 83
     strcat(filepath, "/");
127 84
     strcat(filepath, ".dual_control");
128 85
 
129
-    int check_file = stat(filepath, file_stat);
86
+    struct stat file_stat;
87
+    int check_file = stat(filepath, &file_stat);
130 88
     if (check_file) {
131 89
         goto finally;
132 90
     }
133 91
 
134
-
135 92
     // read the file and grab token
136 93
     char fetched_token[7];
137 94
     FILE *fp = 0;
... ...
@@ -148,11 +105,10 @@ int validate_token(const char *token) {
148 105
 
149 106
     finally:
150 107
 
151
-    free(user);
152
-    free_buffer(&user_buffer);
153
-    free_buffer(&directory_buffer);
154
-    free(file_stat);
155 108
     free(filepath);
109
+    free(working_token);
110
+    free_buffer(&buffer);
111
+
156 112
     return ok;
157 113
 }
158 114