IPv6 and IPv4 usage have a design flaw

Got an idea for enhancing PureBasic? New command(s) you'd like to see?
tj1010
Enthusiast
Enthusiast
Posts: 716
Joined: Mon Feb 25, 2013 5:51 pm

IPv6 and IPv4 usage have a design flaw

Post by tj1010 »

calling anything with #PB_Network_IPv4 when IPv6 or #PB_Network_IPv6 when IPv4 causes memory corruption. FreeIP() causes memory corruption when used on IPv4. There is a either/or strict usage case and no way to detect which before you have to actually use those strict cases.

My Suggestion: Get rid of parameters and FreeIP() completely and handle internally or redesign and add something for version detection.

Code: Select all

;small server with UI to demo the IPv6 problem. Connect with IPv4
Global tstate.b
Define.l event,gadget,etype
Declare server(*val)

If OpenWindow(0,0,0,600,400,"IP test",#PB_Window_ScreenCentered|#PB_Window_MinimizeGadget)
  ListViewGadget(0,0,0,WindowWidth(0),WindowHeight(0)-30)
  ButtonGadget(1,WindowWidth(0)-100,WindowHeight(0)-26,99,25,"Start Server")
  Repeat
    event=WaitWindowEvent()
    gadget=EventGadget()
    etype=EventType()
    If event=#PB_Event_Gadget
      Select gadget
        Case 1
          If tstate=#False
            CreateThread(@server(),1)
          Else
            tstate=#False
          EndIf
      EndSelect
    EndIf
  Until event=#PB_Event_CloseWindow
  HideWindow(0,1)
  tstate=#False
  Delay(2000)
EndIf
End

Procedure server(*val)
  If InitNetwork()
    Define *Buffer = AllocateMemory(1000)
    Define.l bsize
    Define.s netdata$
    If CreateNetworkServer(0,666)
      SetGadgetText(1,"Stop Server")
      Repeat
        SEvent = NetworkServerEvent()
        If SEvent 
          ClientID = EventClient()
          Select SEvent
            Case #PB_NetworkEvent_Connect
              AddGadgetItem(0,-1,IPString(GetClientIP(ClientID),#PB_Network_IPv6)+" connected")
              FreeIP(GetClientIP(ClientID))
            Case #PB_NetworkEvent_Data
              Repeat
                bsize=ReceiveNetworkData(ClientID,*Buffer,1000)
                netdata$=netdata$+Trim(PeekS(*Buffer,1000))
                If bsize<MemorySize(*Buffer)
                  Break
                EndIf
              ForEver
              FreeMemory(*Buffer) : *Buffer=AllocateMemory(1000)
              AddGadgetItem(0,-1,IPString(GetClientIP(ClientID),#PB_Network_IPv6)+" sent:"+netdata$)
              FreeIP(GetClientIP(ClientID))
              netdata$=""
            Case #PB_NetworkEvent_Disconnect
              AddGadgetItem(0,-1,IPString(GetClientIP(ClientID),#PB_Network_IPv6)+" disconnected")
              FreeIP(GetClientIP(ClientID))
          EndSelect
        EndIf
      Until tstate=#False
      CloseNetworkServer(0)
      FreeMemory(*Buffer)
      SetGadgetText(1,"Start Server")
    EndIf
  EndIf
EndProcedure