Browse code
memory management improvements
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 |
|