Ignore:
Timestamp:
Oct 8, 2009, 8:10:05 AM (16 years ago)
Author:
Herwig Bauernfeind
Message:

Update 3.3. to 3.3.8 (security update)

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/samba-3.3.x/source/smbd/process.c

    r223 r338  
    439439        msg->end_time = end_time;
    440440        msg->encrypted = req->encrypted;
     441        msg->processed = false;
    441442
    442443        if (private_data) {
     
    494495                        (unsigned int)msg_mid ));
    495496                if (mid == msg_mid) {
     497
     498                        if (pml->processed) {
     499                                /* A processed message should not be
     500                                 * rescheduled. */
     501                                DEBUG(0,("schedule_deferred_open_smb_message: LOGIC ERROR "
     502                                        "message mid %u was already processed\n",
     503                                        (unsigned int)msg_mid ));
     504                                continue;
     505                        }
     506
    496507                        DEBUG(10,("schedule_deferred_open_smb_message: scheduling mid %u\n",
    497508                                mid ));
     
    508519
    509520/****************************************************************************
    510  Return true if this mid is on the deferred queue.
     521 Return true if this mid is on the deferred queue and was not yet processed.
    511522****************************************************************************/
    512523
     
    516527
    517528        for (pml = deferred_open_queue; pml; pml = pml->next) {
    518                 if (SVAL(pml->buf.data,smb_mid) == mid) {
     529                if (SVAL(pml->buf.data,smb_mid) == mid && !pml->processed) {
    519530                        return True;
    520531                }
     
    785796                           know this is a retry. */
    786797                        DEBUG(5,("receive_message_or_smb: returning deferred open smb message.\n"));
     798
     799                        /* Mark the message as processed so this is not
     800                         * re-processed in error. */
     801                        msg->processed = true;
    787802                        return NT_STATUS_OK;
    788803                }
     
    14291444                if (!change_to_user(conn,session_tag)) {
    14301445                        reply_nterror(req, NT_STATUS_DOS(ERRSRV, ERRbaduid));
    1431                         remove_deferred_open_smb_message(req->mid);
    14321446                        return conn;
    14331447                }
     
    14941508static void construct_reply(char *inbuf, int size, size_t unread_bytes, bool encrypted)
    14951509{
     1510        struct pending_message_list *pml = NULL;
    14961511        uint8 type = CVAL(inbuf,smb_com);
    14971512        connection_struct *conn;
     
    15081523
    15091524        conn = switch_message(type, req, size);
     1525
     1526        /* If this was a deferred message and it's still there and
     1527         * was processed, remove it. */
     1528        pml = get_open_deferred_message(req->mid);
     1529        if (pml && pml->processed) {
     1530                remove_deferred_open_smb_message(req->mid);
     1531        }
    15101532
    15111533        if (req->unread_bytes) {
Note: See TracChangeset for help on using the changeset viewer.