Avatar billede bjering Nybegynder
03. januar 2005 - 18:48 Der er 4 kommentarer og
1 løsning

problem med buffer i C

nu har jeg snart rykket alt håret af, har prøvet at fikse det her i snart 2 dage...

i C har jeg koden :

        if (keyflag)
        {
            char * alldata = sp; // contains all encryptet data
            const u_char * buffer; // will contain unencryptet part of the data (only the part that needs unencryptet)
            static int currentloc = 0;
            static int newloc = 0;
            unsigned short int * strsize = 0;
            unsigned short int * decsize = 0;

            log(1, "[Raw data follows]<br>\n");
            packetlog(length, (const unsigned char*)sp);

            while(currentloc < length) // aslong there is still data left in buffer we do this.
            {
                newloc = currentloc; // get where we where last time in the alldata buffer       
                strsize = alldata[newloc];
                buffer = (unsigned char *)calloc(strsize+4,sizeof(unsigned char)); // allocate memory to the buffer

                if( buffer == NULL )
                {
                    printf( "Insufficient memory available\n" );
                    break;
                }
                else
                {
                    memcpy(buffer, (char*)&alldata[newloc], strsize); // copy xxxx byte from alldata to buffer
                    lineage_decode(lin_gsks, sport, (u_char *)&buffer[2], (strsize-2), &lin_keys.encodekey, &lin_keys.decodekey);

                    log(1, "[Decoded data for opcode 0x%.2x follows (size %i)]<br>\n", buffer[2], strsize-2);
                    packetlog(strsize-2, (const unsigned char*)&buffer[2]);
                   
                    currentloc = newloc + strsize; // set next location in alldata to be decryptet
                    strsize = 0;
                    decsize = 0;
                    newloc = 0;
                }
            }
            strsize = 0;
            decsize = 0;
            currentloc = 0;
            newloc = 0;
        }

den får en pakke ind i som feks ser sådan ud:

[18:35:04] [**START**] packet size=94 sport 2000
[18:35:04] [Raw data follows]
[ DATA ] (0x0000) 0A 00 D5 6A 41 36 DD 0C 15 00 1A 00 39 A5 36 70 ...jA6......9.6p
[ DATA ] (0x0010) 7F 8D 11 D4 6F 80 61 D4 FC 0E 94 43 1C C0 AC 13 ....o.a....C....
[ DATA ] (0x0020) 71 8F 17 AD 1A 00 78 C7 62 64 47 82 D9 41 F6 D3 q.....x.bdG..A..
[ DATA ] (0x0030) 0A 00 36 00 00 00 36 00 00 00 14 00 00 00 00 0F ..6...6.........
[ DATA ] (0x0040) B5 1C 2A C4 00 30 4F 1D 08 09 08 00 45 00 00 28 ..*..0O.....E..(
[ DATA ] (0x0050) 99 7F 40 00 80 06 4B BF C0 A8 00 02 3F 6E 15 79 ..@...K.....?n.y

den skulle så gerne køre pakken (det er mange pakker i en) ud en efter en efter størelsen [0A 00] = 10 bytes -> 10 bytes hen -> [1A 00] = 26, osvosv i gennem while løkken indtil pakken er kørt helt igennem..

men jeg ser 2 fejl her

fordi min output fil ser sådan her ud:

[18:35:04] [Decoded data for opcode 0x64 follows (size 6)]
[ DATA ] (0x0000) 64 03 00 25 27 23
18:35:04] [Decoded data for opcode 0x23 follows (size 22)]
[ DATA ] (0x0000) 23 58 6F 52 00 00 04 00 F6 21 85 00 43 00 02 12
[ DATA ] (0x0010) 12 12 08 0A 09 0C
<--- her får jeg en memory allocation failed ting (for næste pakke)
[18:35:04] [** END **] Lineage packet

fejlen ser man nemt, 0x64 follows (size 6)], pakkens størelse er [0A 00] som man kan se i den raw pakke, dvs 10 bytes, men skal ikke røre størelse byts'ne, så size = size - 2; = 8 bytes

hvordan dælen kan den blive 6 bytes ?? giver ingen mening, og hvorfor får jeg de buffer allocation failed, low memory ting ?

takker :)
Avatar billede arne_v Ekspert
03. januar 2005 - 18:56 #1
unsigned short int * strsize = 0;
...
strsize = alldata[newloc];

skal vel være:

unsigned short int strsize = 0;
...
strsize = *((unsigned short int *)&alldata[newloc]);
Avatar billede arne_v Ekspert
03. januar 2005 - 18:56 #2
Når du tager en pointer til short og trækker 2 fra så trækker du jo 4 bytes fra.

Det er der de 6 kommer fra.
Avatar billede bjering Nybegynder
03. januar 2005 - 19:17 #3
k prøver
Avatar billede bjering Nybegynder
03. januar 2005 - 22:23 #4
ser ud someom det bare virker, (selvom jeg vidst har et buffer problem ved min packet system, men det hører ikke under her, tror oxo nok jeg ved hvorfor).

hvis du smider et svar arne så får du lige point'sne
Avatar billede arne_v Ekspert
03. januar 2005 - 22:25 #5
svar
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester