[Tile-serving] [openstreetmap/osm2pgsql] get_transform (#1150)

mmd notifications at github.com
Sun May 3 19:39:07 UTC 2020


Found this segfault while chaos testing commit: 691f016450b838d6a3bbf287e9a50c7b355512db
The Lua code isn't particulariy meaningful. However, I would expect some kind of error message, if something is not ok with the Lua code.

```
#0  0x00007ffff67aa470 in std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::c_str() const ()
   from /usr/lib/x86_64-linux-gnu/libstdc++.so.6
#1  0x0000555555c5e9bc in get_transform (lua_state=0x40000378, column=...) at /home/mmd/osm2pgsql/src/output-flex.cpp:860
#2  0x0000555555c6fd8e in output_flex_t::add_row<osmium::Node> (this=0x5555565a37b0, table_connection=0x5555565a2850, object=...)
    at /home/mmd/osm2pgsql/src/output-flex.cpp:970
#3  0x0000555555c5da24 in output_flex_t::table_add_row (this=0x5555565a37b0) at /home/mmd/osm2pgsql/src/output-flex.cpp:784
#4  0x0000555555c54ed1 in lua_trampoline_table_add_row (lua_state=0x40000378) at /home/mmd/osm2pgsql/src/output-flex.cpp:64
#5  0x00007ffff6a15e37 in ?? () from /usr/lib/x86_64-linux-gnu/libluajit-5.1.so.2
#6  0x00007ffff6a6327c in lua_pcall () from /usr/lib/x86_64-linux-gnu/libluajit-5.1.so.2
#7  0x0000555555d5d3bf in luaX_pcall (lua_state=0x40000378, narg=1, nres=0) at /home/mmd/osm2pgsql/src/lua-utils.cpp:165
#8  0x0000555555c5fc35 in output_flex_t::call_process_function (this=0x5555565a37b0, index=1, object=...) at /home/mmd/osm2pgsql/src/output-flex.cpp:999
#9  0x0000555555c60d3a in output_flex_t::node_add (this=0x5555565a37b0, node=...) at /home/mmd/osm2pgsql/src/output-flex.cpp:1132
#10 0x0000555555b68ca7 in osmdata_t::node_add (this=0x7fffffffd4a0, node=...) at /home/mmd/osm2pgsql/src/osmdata.cpp:55
#11 0x0000555555bc7e2d in parse_osmium_t::node (this=0x7fffffffd540, node=...) at /home/mmd/osm2pgsql/src/parse-osmium.cpp:160
#12 0x0000555555c34cbc in osmium::detail::apply_item_impl<parse_osmium_t&, osmium::memory::Item> (item=..., handler=...)
    at /home/mmd/osm2pgsql/contrib/libosmium/include/osmium/visitor.hpp:61
#13 0x0000555555c30314 in osmium::apply_item<osmium::memory::Item, parse_osmium_t&> (item=...)
    at /home/mmd/osm2pgsql/contrib/libosmium/include/osmium/visitor.hpp:303
#14 0x0000555555c28579 in osmium::apply_impl<osmium::io::InputIterator<osmium::io::Reader, osmium::memory::Item>, parse_osmium_t&> (it=..., end=...)
    at /home/mmd/osm2pgsql/contrib/libosmium/include/osmium/visitor.hpp:317
#15 0x0000555555c1f3a7 in osmium::apply<osmium::io::InputIterator<osmium::io::Reader, osmium::memory::Item>, parse_osmium_t&> (it=..., end=...)
    at /home/mmd/osm2pgsql/contrib/libosmium/include/osmium/visitor.hpp:324
#16 0x0000555555c142cf in osmium::apply<osmium::io::Reader, parse_osmium_t&> (c=...) at /home/mmd/osm2pgsql/contrib/libosmium/include/osmium/visitor.hpp:331
#17 0x0000555555bc77b7 in parse_osmium_t::stream_file (this=0x7fffffffd540, filename="/home/mmd/btrfs/germany-latest.osm.pbf", fmt="auto")
    at /home/mmd/osm2pgsql/src/parse-osmium.cpp:128
#18 0x0000555555abb446 in main (argc=17, argv=0x7fffffffda68) at /home/mmd/osm2pgsql/src/osm2pgsql.cpp:91
```

Lua:

```
local tables = {}

local pg_cols = {
    point = {
        'access'
    }
}

col_definitions = {
    point = {
        { column = 'way', type = 'point' },
        { column = 'tags', type = 'hstore' },
        { column = 'layer', type = 'int4' }
    }
}

local columns_map = {}
for tablename, columns in pairs(pg_cols) do
    columns_map[tablename] = {}
    for _, key in ipairs(columns) do
        table.insert(col_definitions[tablename], {column = key, type = "text"})
        columns_map[tablename][key] = true
    end
end

tables.point = osm2pgsql.define_table{
    name = 'planet_osm_point',
    ids = { type = 'node', id_column = 'osm_id' },
    columns = col_definitions.point
}

function layer (v)
    return v and string.find(v, "^-?%d+$") and tonumber(v) < 100 and tonumber(v) > -100 and v or nil
end

function clean_tags(tags)
    if next(tags) == nil then
        return true
    end

    return next(tags) == nil
end

function split_tags(tags, tag_map)
    local cols = {tags = {}}
    for key, value in pairs(tags) do
        if tag_map[key] then
            cols[key] = value
        else
            cols.tags[key] = value
        end
    end
    return cols
end

function add_point(tags)
    local cols = split_tags(tags, columns_map.point)
    cols['layer'] = layer(tags['layer'])
    tables.point:add_row(cols)
end

function osm2pgsql.process_node(object)
    if clean_tags(object.tags) then
        return
    end

    osm2pgsql.define_table{
      name = 'demo', 
      ids = { type = 'node', id_column = 'osm_id' },
      columns = col_definitions.point
    }

    add_point(object.tags)
end

function osm2pgsql.process_way(object)

end

function osm2pgsql.process_relation(object)

end
```

-- 
You are receiving this because you are subscribed to this thread.
Reply to this email directly or view it on GitHub:
https://github.com/openstreetmap/osm2pgsql/issues/1150
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.openstreetmap.org/pipermail/tile-serving/attachments/20200503/b1a441cb/attachment.htm>


More information about the Tile-serving mailing list