Changeset 134 for branches/samba-3.0/source/smbd/nttrans.c
- Timestamp:
- May 23, 2008, 6:56:41 AM (17 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/samba-3.0/source/smbd/nttrans.c
r105 r134 2979 2979 uint32 dscnt = IVAL(inbuf,smb_nt_DataCount); 2980 2980 uint32 dsoff = IVAL(inbuf,smb_nt_DataOffset); 2981 2981 uint32 av_size = size-4; 2982 2982 2983 uint16 function_code = SVAL( inbuf, smb_nt_Function); 2983 2984 NTSTATUS result; … … 3050 3051 return(ERROR_DOS(ERRDOS,ERRnomem)); 3051 3052 } 3052 if ((dsoff+dscnt < dsoff) || (dsoff+dscnt < dscnt)) 3053 3054 if (dscnt > state->total_data || 3055 dsoff+dscnt < dsoff) { 3053 3056 goto bad_param; 3054 if ((smb_base(inbuf)+dsoff+dscnt > inbuf + size) || 3055 (smb_base(inbuf)+dsoff+dscnt < smb_base(inbuf))) 3057 } 3058 3059 if (dsoff > av_size || 3060 dscnt > av_size || 3061 dsoff+dscnt > av_size) { 3056 3062 goto bad_param; 3063 } 3057 3064 3058 3065 memcpy(state->data,smb_base(inbuf)+dsoff,dscnt); … … 3070 3077 return(ERROR_DOS(ERRDOS,ERRnomem)); 3071 3078 } 3072 if ((psoff+pscnt < psoff) || (psoff+pscnt < pscnt)) 3079 3080 if (pscnt > state->total_param || 3081 psoff+pscnt < psoff) { 3073 3082 goto bad_param; 3074 if ((smb_base(inbuf)+psoff+pscnt > inbuf + size) || 3075 (smb_base(inbuf)+psoff+pscnt < smb_base(inbuf))) 3083 } 3084 3085 if (psoff > av_size || 3086 pscnt > av_size || 3087 psoff+pscnt > av_size) { 3076 3088 goto bad_param; 3089 } 3077 3090 3078 3091 memcpy(state->param,smb_base(inbuf)+psoff,pscnt); … … 3145 3158 { 3146 3159 int outsize = 0; 3147 unsigned int pcnt,poff,dcnt,doff,pdisp,ddisp; 3160 uint32_t pcnt,poff,dcnt,doff,pdisp,ddisp; 3161 uint32_t av_size = size-4; 3148 3162 struct trans_state *state; 3149 3163 … … 3189 3203 3190 3204 if (pcnt) { 3191 if (pdisp+pcnt > state->total_param) 3205 if (pdisp > state->total_param || 3206 pcnt > state->total_param || 3207 pdisp+pcnt > state->total_param || 3208 pdisp+pcnt < pdisp) { 3192 3209 goto bad_param; 3193 if ((pdisp+pcnt < pdisp) || (pdisp+pcnt < pcnt)) 3210 } 3211 3212 if (poff > av_size || 3213 pcnt > av_size || 3214 poff+pcnt > av_size || 3215 poff+pcnt < poff) { 3194 3216 goto bad_param; 3195 if (pdisp > state->total_param) 3196 goto bad_param; 3197 if ((smb_base(inbuf) + poff + pcnt > inbuf + size) || 3198 (smb_base(inbuf) + poff + pcnt < smb_base(inbuf))) 3199 goto bad_param; 3200 if (state->param + pdisp < state->param) 3201 goto bad_param; 3217 } 3202 3218 3203 3219 memcpy(state->param+pdisp,smb_base(inbuf)+poff, … … 3206 3222 3207 3223 if (dcnt) { 3208 if (ddisp+dcnt > state->total_data) 3224 if (ddisp > state->total_data || 3225 dcnt > state->total_data || 3226 ddisp+dcnt > state->total_data || 3227 ddisp+dcnt < ddisp) { 3209 3228 goto bad_param; 3210 if ((ddisp+dcnt < ddisp) || (ddisp+dcnt < dcnt)) 3229 } 3230 3231 if (ddisp > av_size || 3232 dcnt > av_size || 3233 ddisp+dcnt > av_size || 3234 ddisp+dcnt < ddisp) { 3211 3235 goto bad_param; 3212 if (ddisp > state->total_data) 3213 goto bad_param; 3214 if ((smb_base(inbuf) + doff + dcnt > inbuf + size) || 3215 (smb_base(inbuf) + doff + dcnt < smb_base(inbuf))) 3216 goto bad_param; 3217 if (state->data + ddisp < state->data) 3218 goto bad_param; 3236 } 3219 3237 3220 3238 memcpy(state->data+ddisp, smb_base(inbuf)+doff,
Note:
See TracChangeset
for help on using the changeset viewer.