Your message dated Mon, 05 Jan 2015 10:03:50 +0100
with message-id <[email protected]>
and subject line Re: Bug#774611: Acknowledgement (geoip-bin: skipping locations 
if the location ID is not correctly ordered)
has caused the Debian Bug report #774611,
regarding geoip-bin: skipping locations if the location ID is not correctly 
ordered
to be marked as done.

This means that you claim that the problem has been dealt with.
If this is not the case it is now your responsibility to reopen the
Bug report if necessary, and/or fix the problem forthwith.

(NB: If you are a system administrator and have no idea what this
message is talking about, this may indicate a serious mail system
misconfiguration somewhere. Please contact [email protected]
immediately.)


-- 
774611: http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=774611
Debian Bug Tracking System
Contact [email protected] with problems
--- Begin Message ---
Package: geoip-bin
Version: 1.6.2-2
Severity: important
Tags: patch

This patch adds support to skip location IDs, if upstream CSV is not
correctly built.

diff -Naur '--exclude=.svn' tags/1.6.2-2/debian/src/geoip-csv-to-dat.cpp 
branches/jessie/debian/src/geoip-csv-to-dat.cpp
--- tags/1.6.2-2/debian/src/geoip-csv-to-dat.cpp        2014-10-27 
19:31:48.626784609 +0100
+++ branches/jessie/debian/src/geoip-csv-to-dat.cpp     2014-12-30 
19:32:51.588379341 +0100
@@ -694,12 +694,15 @@
        class city_dat_writer : public dat_writer
        {
        public:
-               // All serialized location information
+               // All serialized location information, in one big
+               // undifferentiated block
                std::stringstream location_stream;
 
                // Seek offset of each location within
                // location_stream (relative to the beginning of
-               // location_stream)
+               // location_stream). An offset of -1 means that that
+               // location is not in the table (can happen if the
+               // location info's out of order).
                std::vector<int> location_pos;
 
                city_dat_writer(const char *dat_file_name, GeoIPDBTypes 
database_type);
@@ -744,14 +747,22 @@
        {
                if (it->edges[0] == 0x1000000) // No data
                        it->edges[0] = trie_size;
-               else if (it->edges[0] > 0x1000000) // Ptr to location block
-                       it->edges[0] = location_pos[it->edges[0] - 0x1000000 - 
1] + trie_size;
+               else if (it->edges[0] > 0x1000000) { // Ptr to location block
+                       int loc_id = it->edges[0] - 0x1000000;
+                       if (loc_id >= location_pos.size() || 
location_pos[loc_id] == -1)
+                               error(EX_DATAERR, 1, "Location %d exists in 
blocks but not in locations", loc_id);
+                       it->edges[0] = location_pos[loc_id] + trie_size;
+               }
                // Any other value would indicate a non-leaf node
 
                if (it->edges[1] == 0x1000000) // No data
                        it->edges[1] = trie_size;
-               else if (it->edges[1] > 0x1000000) // Ptr to location block
-                       it->edges[1] = location_pos[it->edges[1] - 0x1000000 - 
1] + trie_size;
+               else if (it->edges[1] > 0x1000000) { // Ptr to location block
+                       int loc_id = it->edges[1] - 0x1000000;
+                       if (loc_id >= location_pos.size() || 
location_pos[loc_id] == -1)
+                               error(EX_DATAERR, 1, "Location %d exists in 
blocks but not in locations", loc_id);
+                       it->edges[1] = location_pos[loc_id] + trie_size;
+               }
                // Any other value would indicate a non-leaf node
        }
 }
@@ -801,19 +812,33 @@
                                              const char *input_file_name,
                                              int input_line_number)
 {
-       // There's nothing wrong with location info being out of
-       // order, but currently we don't support it (i.e. the code
-       // won't work if the info's out of order). Sanity check that
-       // things are in order.
+       // First, we save the offset of this location block.
        int loc_id = ::atoi(info[0].c_str());
-       if (loc_id != location_pos.size() + 1) {
-               error_at_line(EX_DATAERR, 0, input_file_name, input_line_number,
-                             "Location info not in order (currently not 
supported)");
-               return;
-       }
+       if (loc_id >= location_pos.size()) {
+               // We need to add to the location table (this is the
+               // usual case).
+
+               while(loc_id > location_pos.size()) {
+                       // If some numbers were skipped in the data,
+                       // then we need to add some empty locations to
+                       // the table before we find our spot.
+                       location_pos.push_back(-1);
+               }
 
-       // First, we save the offset of this location block.
-       location_pos.push_back(location_stream.tellp());
+               // Now we have our spot, insert this location.
+               location_pos.push_back(location_stream.tellp());
+       } else {
+               // We already have a space in the table for this location --
+               // if it's not empty, then we have two locations with the same
+               // ID, and we print an error.
+               if (location_pos[loc_id] != -1) {
+                       error_at_line(EX_DATAERR, 0, input_file_name,
+                                     input_line_number,
+                                     "Duplicate location info for ID %d",
+                                     loc_id);
+               }
+               location_pos[loc_id] = location_stream.tellp();
+       }
 
        // Country ID
        int country_id;
@@ -1319,8 +1344,8 @@
                return;
        }
 
-       const int locid = atoi(csv_fields[CSV_BLOCK_FIELD_LOC].c_str());
-       const binary_trie::edge_type leaf = 0x1000000 + locid;
+       const int loc_id = atoi(csv_fields[CSV_BLOCK_FIELD_LOC].c_str());
+       const binary_trie::edge_type leaf = 0x1000000 + loc_id;
 
        if (cmdline.address_family != AF_INET) {
                error(EX_SOFTWARE, 1, "IPv6 with city database is 
unimplemented.");

-- System Information:
Debian Release: 7.7
  APT prefers stable-updates
  APT policy: (500, 'stable-updates'), (500, 'stable')
Architecture: amd64 (x86_64)

Kernel: Linux 3.2.0-4-amd64 (SMP w/2 CPU cores)
Locale: LANG=de_DE.UTF-8, LC_CTYPE=de_DE.UTF-8 (charmap=UTF-8)
Shell: /bin/sh linked to /bin/dash

Versions of packages geoip-bin depends on:
ii  libc6       2.13-38+deb7u6
ii  libgcc1     1:4.7.2-5
ii  libgeoip1   1.4.8+dfsg-3
ii  libstdc++6  4.7.2-5

geoip-bin recommends no packages.

geoip-bin suggests no packages.

-- no debconf information

--- End Message ---
--- Begin Message ---
fixed #774611 1.6.3-2
thanks

Am 05.01.2015 um 09:57 schrieb Debian Bug Tracking System:
Thank you for filing a new Bug report with Debian.

This is an automatically generated reply to let you know your message
has been received.

Your message is being forwarded to the package maintainers and other
interested parties for their attention; they will reply in due course.

If you wish to submit further information on this problem, please
send it to [email protected].

Please do not send mail to [email protected] unless you wish
to report a problem with the Bug-tracking system.


--
/*
Mit freundlichem Gruß / With kind regards,
 Patrick Matthäi
 GNU/Linux Debian Developer

  Blog: http://www.linux-dev.org/
E-Mail: [email protected]
        [email protected]
*/

--- End Message ---

Reply via email to