Changeset 746 for vendor/current/libcli/smb
- Timestamp:
- Nov 27, 2012, 4:56:06 PM (13 years ago)
- Location:
- vendor/current/libcli/smb
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
vendor/current/libcli/smb/smb2_constants.h
r740 r746 26 26 #define SMB2_HDR_PROTOCOL_ID 0x00 27 27 #define SMB2_HDR_LENGTH 0x04 28 #define SMB2_HDR_EPOCH 0x06 28 #define SMB2_HDR_CREDIT_CHARGE 0x06 29 #define SMB2_HDR_EPOCH SMB2_HDR_CREDIT_CHARGE /* TODO: remove this */ 29 30 #define SMB2_HDR_STATUS 0x08 30 31 #define SMB2_HDR_OPCODE 0x0c -
vendor/current/libcli/smb/smb2_create_blob.c
r414 r746 60 60 if ((next & 0x7) != 0 || 61 61 next > remaining || 62 name_offset < 16 || 63 name_offset > remaining || 64 name_length != 4 || /* windows enforces this */ 62 name_offset != 16 || 63 name_length < 4 || 65 64 name_offset + name_length > remaining || 66 data_offset < name_offset + name_length || 67 data_offset > remaining || 68 data_offset + (uint64_t)data_length > remaining) { 65 (data_offset & 0x7) != 0 || 66 (data_offset && (data_offset < name_offset + name_length)) || 67 (data_offset > remaining) || 68 (data_offset + (uint64_t)data_length > remaining)) { 69 69 return NT_STATUS_INVALID_PARAMETER; 70 70 } … … 106 106 uint32_t ofs = buffer->length; 107 107 size_t tag_length = strlen(blob->tag); 108 uint8_t pad = smb2_create_blob_padding(blob->data.length+tag_length, 4); 109 110 if (!data_blob_realloc(mem_ctx, buffer, 111 buffer->length + 0x14 + tag_length + blob->data.length + pad)) 108 size_t blob_offset = 0; 109 size_t blob_pad = 0; 110 size_t next_offset = 0; 111 size_t next_pad = 0; 112 bool ok; 113 114 blob_offset = 0x10 + tag_length; 115 blob_pad = smb2_create_blob_padding(blob_offset, 8); 116 next_offset = blob_offset + blob_pad + blob->data.length; 117 if (!last) { 118 next_pad = smb2_create_blob_padding(next_offset, 8); 119 } 120 121 ok = data_blob_realloc(mem_ctx, buffer, 122 buffer->length + next_offset + next_pad); 123 if (!ok) { 112 124 return NT_STATUS_NO_MEMORY; 125 } 113 126 114 127 if (last) { 115 128 SIVAL(buffer->data, ofs+0x00, 0); 116 129 } else { 117 SIVAL(buffer->data, ofs+0x00, 0x14 + tag_length + blob->data.length +pad);130 SIVAL(buffer->data, ofs+0x00, next_offset + next_pad); 118 131 } 119 132 SSVAL(buffer->data, ofs+0x04, 0x10); /* offset of tag */ 120 133 SIVAL(buffer->data, ofs+0x06, tag_length); /* tag length */ 121 SSVAL(buffer->data, ofs+0x0A, 0x14 + tag_length); /* offset of data */134 SSVAL(buffer->data, ofs+0x0A, blob_offset + blob_pad); /* offset of data */ 122 135 SIVAL(buffer->data, ofs+0x0C, blob->data.length); 123 136 memcpy(buffer->data+ofs+0x10, blob->tag, tag_length); 124 SIVAL(buffer->data, ofs+0x10+tag_length, 0); /* pad? */ 125 memcpy(buffer->data+ofs+0x14+tag_length, blob->data.data, blob->data.length); 126 memset(buffer->data+ofs+0x14+tag_length+blob->data.length, 0, pad); 137 if (blob_pad > 0) { 138 memset(buffer->data+ofs+blob_offset, 0, blob_pad); 139 blob_offset += blob_pad; 140 } 141 memcpy(buffer->data+ofs+blob_offset, blob->data.data, blob->data.length); 142 if (next_pad > 0) { 143 memset(buffer->data+ofs+next_offset, 0, next_pad); 144 next_offset += next_pad; 145 } 127 146 128 147 return NT_STATUS_OK;
Note:
See TracChangeset
for help on using the changeset viewer.