Changeset 745 for trunk/server/libcli/auth/msrpc_parse.c
- Timestamp:
- Nov 27, 2012, 4:43:17 PM (13 years ago)
- Location:
- trunk/server
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/server
- Property svn:mergeinfo changed
/vendor/current merged: 581,587,591,594,597,600,615,618,740
- Property svn:mergeinfo changed
-
trunk/server/libcli/auth/msrpc_parse.c
r414 r745 41 41 C = constant ascii string 42 42 */ 43 boolmsrpc_gen(TALLOC_CTX *mem_ctx,43 NTSTATUS msrpc_gen(TALLOC_CTX *mem_ctx, 44 44 DATA_BLOB *blob, 45 45 const char *format, ...) … … 58 58 59 59 pointers = talloc_array(mem_ctx, DATA_BLOB, strlen(format)); 60 if (!pointers) { 61 return NT_STATUS_NO_MEMORY; 62 } 60 63 intargs = talloc_array(pointers, int, strlen(format)); 64 if (!intargs) { 65 return NT_STATUS_NO_MEMORY; 66 } 61 67 62 68 /* first scan the format to work out the header and body size */ … … 73 79 if (!ret) { 74 80 va_end(ap); 75 return false;81 return map_nt_error_from_unix(errno); 76 82 } 77 83 pointers[i].length = n; … … 87 93 if (!ret) { 88 94 va_end(ap); 89 return false;95 return map_nt_error_from_unix(errno); 90 96 } 91 97 pointers[i].length = n; … … 103 109 if (!ret) { 104 110 va_end(ap); 105 return false;111 return map_nt_error_from_unix(errno); 106 112 } 107 113 pointers[i].length = n; … … 133 139 head_size += pointers[i].length; 134 140 break; 141 default: 142 va_end(ap); 143 return NT_STATUS_INVALID_PARAMETER; 135 144 } 136 145 } 137 146 va_end(ap); 147 148 if (head_size + data_size == 0) { 149 return NT_STATUS_INVALID_PARAMETER; 150 } 138 151 139 152 /* allocate the space, then scan the format again to fill in the values */ 140 153 *blob = data_blob_talloc(mem_ctx, NULL, head_size + data_size); 141 154 if (!blob->data) { 155 return NT_STATUS_NO_MEMORY; 156 } 142 157 head_ofs = 0; 143 158 data_ofs = head_size; … … 175 190 case 'b': 176 191 n = pointers[i].length; 177 memcpy(blob->data + head_ofs, pointers[i].data, n); 192 if (pointers[i].data && n) { 193 /* don't follow null pointers... */ 194 memcpy(blob->data + head_ofs, pointers[i].data, n); 195 } 178 196 head_ofs += n; 179 197 break; … … 183 201 head_ofs += n; 184 202 break; 203 default: 204 va_end(ap); 205 return NT_STATUS_INVALID_PARAMETER; 185 206 } 186 207 } … … 189 210 talloc_free(pointers); 190 211 191 return true;212 return NT_STATUS_OK; 192 213 } 193 214 … … 229 250 bool ret = true; 230 251 252 if (!p) { 253 return false; 254 } 255 231 256 va_start(ap, format); 232 257 for (i=0; format[i]; i++) { … … 334 359 case 'b': 335 360 b = (DATA_BLOB *)va_arg(ap, void *); 336 len1 = va_arg(ap, u int_t);361 len1 = va_arg(ap, unsigned int); 337 362 /* make sure its in the right format - be strict */ 338 363 NEED_DATA(len1);
Note:
See TracChangeset
for help on using the changeset viewer.