Package: licq Version: 1.3.0-4 Severity: important Hi,
I've just stumbled across a buffer overflow in
icqd.cpp:CICQDaemon::SaveConf() (line 692 in
the pristine file). When the owner list is
written,
772 int n = 1;
773 FOR_EACH_OWNER_START(LOCK_R)
774 {
775 char szOwnerId[11], szOwnerPPID[11];
776 char szPPID[5];
777 sprintf(szOwnerId, "Owner%d.Id", n);
778 sprintf(szOwnerPPID, "Owner%d.PPID", n++);
779
780 szPPID[0] = (pOwner->PPID() & 0xFF000000) >> 24;
781 szPPID[1] = (pOwner->PPID() & 0x00FF0000) >> 16;
782 szPPID[2] = (pOwner->PPID() & 0x0000FF00) >> 8;
783 szPPID[3] = (pOwner->PPID() & 0x000000FF);
784 szPPID[4] = '\0';
785
786 pOwner->SaveLicqInfo();
787 if (strcmp(pOwner->IdString(), "0") != 0)
788 {
789 licqConf.WriteStr(szOwnerId, pOwner->IdString());
790 licqConf.WriteStr(szOwnerPPID, szPPID);
791 }
792 }
793 FOR_EACH_OWNER_END
szOwnerPPID gets at least 12 bytes (!) sprintf()'ed to it
(including the closing \0), depending on the value of n.
As the memory layout happens to place szOwnerId directly
after szOwnerPPID, the former's first byte is overwritten,
which finally results in (line 789)
licqConf.writeStr("\0...", "<my OwnerID>");
and produces a licq.conf like this:
[owners]
NumOfOwners = 1
Owner1.Id = 0
Owner1.PPID = Licq
= <my OwnerID>
(The outcome is that upon each subsequent startup of licq,
I have to reset the UIN via the Owner Manager to its real
value, as it's always initialized to "0")
Doing dynamic allocation based on ol->size() should fix it
(as would increasing the buffer size above a reasonable
length maximum of ol->size()).
Thank you,
Jan
--
Jan C. Nordholz
<jckn At gmx net>
signature.asc
Description: Digital signature

