diff --git a/.gitignore b/.gitignore
index 781a2ad6dc95c3ffe6931e3468a1051a42825a21..067da8c1a74fccbfd7bc3fbe3a589453782f1a3b 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,6 +1,7 @@
 Makefile
 config.log
 config.status
+autom4te.cache
 Doxyfile
 config.h
 examples/test_osm1
diff --git a/configure b/configure
index 5c0c46156f07282bd069b722aa8750118b4d47d5..21558f6e51d87360fd492faca4d1a7818c74f868 100755
--- a/configure
+++ b/configure
@@ -738,6 +738,7 @@ infodir
 docdir
 oldincludedir
 includedir
+runstatedir
 localstatedir
 sharedstatedir
 sysconfdir
@@ -824,6 +825,7 @@ datadir='${datarootdir}'
 sysconfdir='${prefix}/etc'
 sharedstatedir='${prefix}/com'
 localstatedir='${prefix}/var'
+runstatedir='${localstatedir}/run'
 includedir='${prefix}/include'
 oldincludedir='/usr/include'
 docdir='${datarootdir}/doc/${PACKAGE_TARNAME}'
@@ -1076,6 +1078,15 @@ do
   | -silent | --silent | --silen | --sile | --sil)
     silent=yes ;;
 
+  -runstatedir | --runstatedir | --runstatedi | --runstated \
+  | --runstate | --runstat | --runsta | --runst | --runs \
+  | --run | --ru | --r)
+    ac_prev=runstatedir ;;
+  -runstatedir=* | --runstatedir=* | --runstatedi=* | --runstated=* \
+  | --runstate=* | --runstat=* | --runsta=* | --runst=* | --runs=* \
+  | --run=* | --ru=* | --r=*)
+    runstatedir=$ac_optarg ;;
+
   -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)
     ac_prev=sbindir ;;
   -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \
@@ -1213,7 +1224,7 @@ fi
 for ac_var in	exec_prefix prefix bindir sbindir libexecdir datarootdir \
 		datadir sysconfdir sharedstatedir localstatedir includedir \
 		oldincludedir docdir infodir htmldir dvidir pdfdir psdir \
-		libdir localedir mandir
+		libdir localedir mandir runstatedir
 do
   eval ac_val=\$$ac_var
   # Remove trailing slashes.
@@ -1366,6 +1377,7 @@ Fine tuning of the installation directories:
   --sysconfdir=DIR        read-only single-machine data [PREFIX/etc]
   --sharedstatedir=DIR    modifiable architecture-independent data [PREFIX/com]
   --localstatedir=DIR     modifiable single-machine data [PREFIX/var]
+  --runstatedir=DIR       modifiable per-process data [LOCALSTATEDIR/run]
   --libdir=DIR            object code libraries [EPREFIX/lib]
   --includedir=DIR        C header files [PREFIX/include]
   --oldincludedir=DIR     C header files for non-gcc [/usr/include]
diff --git a/headers/readosm_internals.h b/headers/readosm_internals.h
index 10aa3fb5b88d0d071f95570efd9e87ccb574f1df..c376a8cb14abe20a41ead3cf637f003ebecda15c 100644
--- a/headers/readosm_internals.h
+++ b/headers/readosm_internals.h
@@ -44,6 +44,14 @@
 / 
 */
 
+#if 1
+#define XMALLOC(size) (xmalloc((size), __FILE__, __LINE__))
+#else
+#define XMALLOC(size) malloc(size)
+#endif
+
+extern void *xmalloc(size_t size, char *file, int line);
+
 /* endianness */
 #define READOSM_BIG_ENDIAN	0
 #define READOSM_LITTLE_ENDIAN	1
diff --git a/src/osm_objects.c b/src/osm_objects.c
index ee4bf69b6b736ad5dc5791995c0ce0fdcb5c0df6..36915a7838679f68acb682c98a7a793e59777d8c 100644
--- a/src/osm_objects.c
+++ b/src/osm_objects.c
@@ -166,7 +166,7 @@ append_tag_to_node (readosm_internal_node * node, const char *key,
     else
       {
 	  /* appending a further Tag block */
-	  tag_blk = malloc (sizeof (readosm_internal_tag_block));
+	  tag_blk = XMALLOC (sizeof (readosm_internal_tag_block));
 	  tag_blk->next_item = 1;
 	  tag_blk->next = NULL;
 	  tag = tag_blk->tags;
@@ -176,10 +176,10 @@ append_tag_to_node (readosm_internal_node * node, const char *key,
 
 /* initializing the Tag */
     len = strlen (key);
-    tag->key = malloc (len + 1);
+    tag->key = XMALLOC (len + 1);
     strcpy (tag->key, key);
     len = strlen (value);
-    tag->value = malloc (len + 1);
+    tag->value = XMALLOC (len + 1);
     strcpy (tag->value, value);
 }
 
@@ -251,7 +251,7 @@ READOSM_PRIVATE readosm_internal_way *
 alloc_internal_way (void)
 {
 /* allocating an empty internal WAY object */
-    readosm_internal_way *way = malloc (sizeof (readosm_internal_way));
+    readosm_internal_way *way = XMALLOC (sizeof (readosm_internal_way));
     way->id = 0;
     way->version = 0;
     way->changeset = 0;
@@ -283,7 +283,7 @@ append_reference_to_way (readosm_internal_way * way, long long node_ref)
     else
       {
 	  /* appending a further Ref block */
-	  ref = malloc (sizeof (readosm_internal_ref));
+	  ref = XMALLOC (sizeof (readosm_internal_ref));
 	  *(ref->node_refs + 0) = node_ref;
 	  ref->next_item = 1;
 	  ref->next = NULL;
@@ -309,7 +309,7 @@ append_tag_to_way (readosm_internal_way * way, const char *key,
     else
       {
 	  /* appending a further Tag block */
-	  tag_blk = malloc (sizeof (readosm_internal_tag_block));
+	  tag_blk = XMALLOC (sizeof (readosm_internal_tag_block));
 	  tag_blk->next_item = 1;
 	  tag_blk->next = NULL;
 	  tag = tag_blk->tags;
@@ -319,10 +319,10 @@ append_tag_to_way (readosm_internal_way * way, const char *key,
 
 /* initializing the Tag */
     len = strlen (key);
-    tag->key = malloc (len + 1);
+    tag->key = XMALLOC (len + 1);
     strcpy (tag->key, key);
     len = strlen (value);
-    tag->value = malloc (len + 1);
+    tag->value = XMALLOC (len + 1);
     strcpy (tag->value, value);
 }
 
@@ -428,7 +428,7 @@ alloc_internal_relation (void)
 {
 /* allocating an empty internal RELATION object */
     readosm_internal_relation *rel =
-	malloc (sizeof (readosm_internal_relation));
+	XMALLOC (sizeof (readosm_internal_relation));
     rel->id = 0;
     rel->version = 0;
     rel->changeset = 0;
@@ -463,7 +463,7 @@ append_member_to_relation (readosm_internal_relation * relation, int type,
     else
       {
 	  /* appending a further Member block */
-	  mbr_blk = malloc (sizeof (readosm_internal_member_block));
+	  mbr_blk = XMALLOC (sizeof (readosm_internal_member_block));
 	  mbr_blk->next_item = 1;
 	  mbr_blk->next = NULL;
 	  member = mbr_blk->members;
@@ -474,7 +474,7 @@ append_member_to_relation (readosm_internal_relation * relation, int type,
     member->member_type = type;
     member->id = id;
     len = strlen (role);
-    member->role = malloc (len + 1);
+    member->role = XMALLOC (len + 1);
     strcpy (member->role, role);
 }
 
@@ -495,7 +495,7 @@ append_tag_to_relation (readosm_internal_relation * relation, const char *key,
     else
       {
 	  /* appending a further Tag block */
-	  tag_blk = malloc (sizeof (readosm_internal_tag_block));
+	  tag_blk = XMALLOC (sizeof (readosm_internal_tag_block));
 	  tag_blk->next_item = 1;
 	  tag_blk->next = NULL;
 	  tag = tag_blk->tags;
@@ -505,10 +505,10 @@ append_tag_to_relation (readosm_internal_relation * relation, const char *key,
 
 /* initializing the Tag */
     len = strlen (key);
-    tag->key = malloc (len + 1);
+    tag->key = XMALLOC (len + 1);
     strcpy (tag->key, key);
     len = strlen (value);
-    tag->value = malloc (len + 1);
+    tag->value = XMALLOC (len + 1);
     strcpy (tag->value, value);
 }
 
@@ -639,7 +639,7 @@ call_node_callback (readosm_node_callback node_callback,
 	  int i;
 	  readosm_export_tag *p_tag;
 	  exp_node.tags =
-	      malloc (sizeof (readosm_export_tag) * exp_node.tag_count);
+	      XMALLOC (sizeof (readosm_export_tag) * exp_node.tag_count);
 	  for (i = 0; i < exp_node.tag_count; i++)
 	    {
 		p_tag = exp_node.tags + i;
@@ -707,14 +707,14 @@ call_way_callback (readosm_way_callback way_callback,
     if (way->user != NULL)
       {
 	  len = strlen (way->user);
-	  exp_way.user = malloc (len + 1);
+	  exp_way.user = XMALLOC (len + 1);
 	  strcpy (exp_way.user, way->user);
       }
     exp_way.uid = way->uid;
     if (way->timestamp != NULL)
       {
 	  len = strlen (way->timestamp);
-	  exp_way.timestamp = malloc (len + 1);
+	  exp_way.timestamp = XMALLOC (len + 1);
 	  strcpy (exp_way.timestamp, way->timestamp);
       }
 
@@ -729,7 +729,7 @@ call_way_callback (readosm_way_callback way_callback,
     if (exp_way.node_ref_count > 0)
       {
 	  exp_way.node_refs =
-	      malloc (sizeof (long long) * exp_way.node_ref_count);
+	      XMALLOC (sizeof (long long) * exp_way.node_ref_count);
 	  i = 0;
 	  ref = &(way->first_ref);
 	  while (ref)
@@ -754,7 +754,7 @@ call_way_callback (readosm_way_callback way_callback,
       {
 	  readosm_export_tag *p_tag;
 	  exp_way.tags =
-	      malloc (sizeof (readosm_export_tag) * exp_way.tag_count);
+	      XMALLOC (sizeof (readosm_export_tag) * exp_way.tag_count);
 	  for (i = 0; i < exp_way.tag_count; i++)
 	    {
 		p_tag = exp_way.tags + i;
@@ -771,13 +771,13 @@ call_way_callback (readosm_way_callback way_callback,
 		      if (tag->key != NULL)
 			{
 			    len = strlen (tag->key);
-			    p_tag->key = malloc (len + 1);
+			    p_tag->key = XMALLOC (len + 1);
 			    strcpy (p_tag->key, tag->key);
 			}
 		      if (tag->value != NULL)
 			{
 			    len = strlen (tag->value);
-			    p_tag->value = malloc (len + 1);
+			    p_tag->value = XMALLOC (len + 1);
 			    strcpy (p_tag->value, tag->value);
 			}
 		      i++;
@@ -826,14 +826,14 @@ call_relation_callback (readosm_relation_callback relation_callback,
     if (relation->user != NULL)
       {
 	  len = strlen (relation->user);
-	  exp_relation.user = malloc (len + 1);
+	  exp_relation.user = XMALLOC (len + 1);
 	  strcpy (exp_relation.user, relation->user);
       }
     exp_relation.uid = relation->uid;
     if (relation->timestamp != NULL)
       {
 	  len = strlen (relation->timestamp);
-	  exp_relation.timestamp = malloc (len + 1);
+	  exp_relation.timestamp = XMALLOC (len + 1);
 	  strcpy (exp_relation.timestamp, relation->timestamp);
       }
 
@@ -848,7 +848,7 @@ call_relation_callback (readosm_relation_callback relation_callback,
       {
 	  readosm_export_member *p_member;
 	  exp_relation.members =
-	      malloc (sizeof (readosm_export_member) *
+	      XMALLOC (sizeof (readosm_export_member) *
 		      exp_relation.member_count);
 	  for (i = 0; i < exp_relation.member_count; i++)
 	    {
@@ -868,7 +868,7 @@ call_relation_callback (readosm_relation_callback relation_callback,
 		      if (member->role != NULL)
 			{
 			    len = strlen (member->role);
-			    p_member->role = malloc (len + 1);
+			    p_member->role = XMALLOC (len + 1);
 			    strcpy (p_member->role, member->role);
 			}
 		      i++;
@@ -888,7 +888,7 @@ call_relation_callback (readosm_relation_callback relation_callback,
       {
 	  readosm_export_tag *p_tag;
 	  exp_relation.tags =
-	      malloc (sizeof (readosm_export_tag) * exp_relation.tag_count);
+	      XMALLOC (sizeof (readosm_export_tag) * exp_relation.tag_count);
 	  for (i = 0; i < exp_relation.tag_count; i++)
 	    {
 		p_tag = exp_relation.tags + i;
@@ -905,13 +905,13 @@ call_relation_callback (readosm_relation_callback relation_callback,
 		      if (tag->key != NULL)
 			{
 			    len = strlen (tag->key);
-			    p_tag->key = malloc (len + 1);
+			    p_tag->key = XMALLOC (len + 1);
 			    strcpy (p_tag->key, tag->key);
 			}
 		      if (tag->value != NULL)
 			{
 			    len = strlen (tag->value);
-			    p_tag->value = malloc (len + 1);
+			    p_tag->value = XMALLOC (len + 1);
 			    strcpy (p_tag->value, tag->value);
 			}
 		      i++;
diff --git a/src/osmxml.c b/src/osmxml.c
index ff0993f1746e683f624c41545c6ddce4a78c4476..d920e3565c6a3c9fccdb20d4235ad4ee1123468f 100644
--- a/src/osmxml.c
+++ b/src/osmxml.c
@@ -255,7 +255,7 @@ xml_start_node (struct xml_params *params, const char **attr)
 	  if (strcmp (attr[i], "user") == 0)
 	    {
 		len = strlen (attr[i + 1]);
-		params->node.user = malloc (len + 1);
+		params->node.user = XMALLOC (len + 1);
 		strcpy (params->node.user, attr[i + 1]);
 	    }
 	  if (strcmp (attr[i], "uid") == 0)
@@ -263,7 +263,7 @@ xml_start_node (struct xml_params *params, const char **attr)
 	  if (strcmp (attr[i], "timestamp") == 0)
 	    {
 		len = strlen (attr[i + 1]);
-		params->node.timestamp = malloc (len + 1);
+		params->node.timestamp = XMALLOC (len + 1);
 		strcpy (params->node.timestamp, attr[i + 1]);
 	    }
       }
@@ -303,7 +303,7 @@ xml_start_way (struct xml_params *params, const char **attr)
 	  if (strcmp (attr[i], "user") == 0)
 	    {
 		len = strlen (attr[i + 1]);
-		params->way.user = malloc (len + 1);
+		params->way.user = XMALLOC (len + 1);
 		strcpy (params->way.user, attr[i + 1]);
 	    }
 	  if (strcmp (attr[i], "uid") == 0)
@@ -311,7 +311,7 @@ xml_start_way (struct xml_params *params, const char **attr)
 	  if (strcmp (attr[i], "timestamp") == 0)
 	    {
 		len = strlen (attr[i + 1]);
-		params->way.timestamp = malloc (len + 1);
+		params->way.timestamp = XMALLOC (len + 1);
 		strcpy (params->way.timestamp, attr[i + 1]);
 	    }
       }
@@ -350,7 +350,7 @@ xml_start_relation (struct xml_params *params, const char **attr)
 	  if (strcmp (attr[i], "user") == 0)
 	    {
 		len = strlen (attr[i + 1]);
-		params->relation.user = malloc (len + 1);
+		params->relation.user = XMALLOC (len + 1);
 		strcpy (params->relation.user, attr[i + 1]);
 	    }
 	  if (strcmp (attr[i], "uid") == 0)
@@ -358,7 +358,7 @@ xml_start_relation (struct xml_params *params, const char **attr)
 	  if (strcmp (attr[i], "timestamp") == 0)
 	    {
 		len = strlen (attr[i + 1]);
-		params->relation.timestamp = malloc (len + 1);
+		params->relation.timestamp = XMALLOC (len + 1);
 		strcpy (params->relation.timestamp, attr[i + 1]);
 	    }
       }
diff --git a/src/protobuf.c b/src/protobuf.c
index f127d8cc4f4afdd1073f77c1bfca32ec1ae4198c..f77240d4e2ac4a60a56f6f8cf16d94a9a113ca31 100644
--- a/src/protobuf.c
+++ b/src/protobuf.c
@@ -104,7 +104,7 @@ add_variant_hints (readosm_variant * variant, unsigned char type,
 		   unsigned char field_id)
 {
 /* adding a field hint to a PBF Variant object */
-    readosm_variant_hint *hint = malloc (sizeof (readosm_variant_hint));
+    readosm_variant_hint *hint = XMALLOC (sizeof (readosm_variant_hint));
     hint->type = type;
     hint->field_id = field_id;
     hint->next = NULL;
@@ -188,8 +188,8 @@ append_string_to_table (readosm_string_table * string_table,
 			readosm_variant * variant)
 {
 /* appending a string to a PBF StringTable object */
-    readosm_string *string = malloc (sizeof (readosm_string));
-    string->string = malloc (variant->length + 1);
+    readosm_string *string = XMALLOC (sizeof (readosm_string));
+    string->string = XMALLOC (variant->length + 1);
     memcpy (string->string, variant->pointer, variant->length);
     *(string->string + variant->length) = '\0';
     string->next = NULL;
@@ -217,7 +217,7 @@ array_from_string_table (readosm_string_table * string_table)
 
 /* allocating the pointer array */
     string_table->strings =
-	malloc (sizeof (readosm_string *) * string_table->count);
+	XMALLOC (sizeof (readosm_string *) * string_table->count);
     i = 0;
     string = string_table->first;
     while (string != NULL)
@@ -864,7 +864,7 @@ skip_osm_header (readosm_file * input, unsigned int sz)
     int ok_header = 0;
     int hdsz = 0;
     size_t rd;
-    unsigned char *buf = malloc (sz);
+    unsigned char *buf = XMALLOC (sz);
     unsigned char *base = buf;
     unsigned char *start = buf;
     unsigned char *stop = buf + sz - 1;
@@ -908,7 +908,7 @@ skip_osm_header (readosm_file * input, unsigned int sz)
     if (!ok_header || !hdsz)
 	goto error;
 
-    buf = malloc (hdsz);
+    buf = XMALLOC (hdsz);
     base = buf;
     start = buf;
     stop = buf + hdsz - 1;
@@ -1063,7 +1063,7 @@ parse_pbf_node_infos (readosm_packed_infos * packed_infos,
 		  }
 		if (count > 0)
 		  {
-		      packed_infos->versions = malloc (sizeof (int) * count);
+		      packed_infos->versions = XMALLOC (sizeof (int) * count);
                       for (int kk = 0; kk < count; kk++)
 			{
 			    *(packed_infos->versions + kk) = packed_u32.values[kk];
@@ -1089,7 +1089,7 @@ parse_pbf_node_infos (readosm_packed_infos * packed_infos,
 		  }
 		if (count > 0)
 		  {
-		      packed_infos->timestamps = malloc (sizeof (int) * count);
+		      packed_infos->timestamps = XMALLOC (sizeof (int) * count);
                       for (int kk = 0; kk < count; kk++)
 			{
 			    delta += packed_32.values[kk];
@@ -1117,7 +1117,7 @@ parse_pbf_node_infos (readosm_packed_infos * packed_infos,
 		if (count > 0)
 		  {
 		      packed_infos->changesets =
-			  malloc (sizeof (long long) * count);
+			  XMALLOC (sizeof (long long) * count);
                       for (int kk = 0; kk < count; kk++)
 			{
 			    delta += packed_64.values[kk];
@@ -1144,7 +1144,7 @@ parse_pbf_node_infos (readosm_packed_infos * packed_infos,
 		  }
 		if (count > 0)
 		  {
-		      packed_infos->uids = malloc (sizeof (int) * count);
+		      packed_infos->uids = XMALLOC (sizeof (int) * count);
 		      count = 0;
                       for (int kk = 0; kk < count; kk++)
 			{
@@ -1172,7 +1172,7 @@ parse_pbf_node_infos (readosm_packed_infos * packed_infos,
 		  }
 		if (count > 0)
 		  {
-		      packed_infos->users = malloc (sizeof (int) * count);
+		      packed_infos->users = XMALLOC (sizeof (int) * count);
                       for (int kk = 0; kk < count; kk++)
 			{
 			    delta += packed_32.values[kk];
@@ -1348,7 +1348,7 @@ parse_pbf_nodes (readosm_string_table * strings,
 	  int max_nodes;
 	  int base = 0;
 	  nd_count = packed_ids.count;
-          nodes = malloc (sizeof (readosm_internal_node) * MAX_NODES);
+          nodes = XMALLOC (sizeof (readosm_internal_node) * MAX_NODES);
 	  while (base < nd_count)
 	    {
 		/* processing about 1024 nodes at each time */
@@ -1396,7 +1396,7 @@ parse_pbf_nodes (readosm_string_table * strings,
 				  if (nd->timestamp)
 				      free (nd->timestamp);
 				  len = strlen (buf);
-				  nd->timestamp = malloc (len + 1);
+				  nd->timestamp = XMALLOC (len + 1);
 				  strcpy (nd->timestamp, buf);
 			      }
 			    nd->changeset =
@@ -1414,7 +1414,7 @@ parse_pbf_nodes (readosm_string_table * strings,
 				      free (nd->user);
 				  if (len > 0)
 				    {
-					nd->user = malloc (len + 1);
+					nd->user = XMALLOC (len + 1);
 					strcpy (nd->user, s_ptr->string);
 				    }
 			      }
@@ -1562,7 +1562,7 @@ parse_pbf_way_info (readosm_internal_way * way, readosm_string_table * strings,
 		      if (way->timestamp)
 			  free (way->timestamp);
 		      len = strlen (buf);
-		      way->timestamp = malloc (len + 1);
+		      way->timestamp = XMALLOC (len + 1);
 		      strcpy (way->timestamp, buf);
 		  }
 	    }
@@ -1588,7 +1588,7 @@ parse_pbf_way_info (readosm_internal_way * way, readosm_string_table * strings,
 		  {
 		      readosm_string *string = *(strings->strings + userid);
 		      int len = strlen (string->string);
-		      way->user = malloc (len + 1);
+		      way->user = XMALLOC (len + 1);
 		      strcpy (way->user, string->string);
 		  }
 	    }
@@ -1785,7 +1785,7 @@ parse_pbf_relation_info (readosm_internal_relation * relation,
 		      if (relation->timestamp)
 			  free (relation->timestamp);
 		      len = strlen (buf);
-		      relation->timestamp = malloc (len + 1);
+		      relation->timestamp = XMALLOC (len + 1);
 		      strcpy (relation->timestamp, buf);
 		  }
 	    }
@@ -1811,7 +1811,7 @@ parse_pbf_relation_info (readosm_internal_relation * relation,
 		  {
 		      readosm_string *string = *(strings->strings + userid);
 		      int len = strlen (string->string);
-		      relation->user = malloc (len + 1);
+		      relation->user = XMALLOC (len + 1);
 		      strcpy (relation->user, string->string);
 		  }
 	    }
@@ -2093,7 +2093,7 @@ parse_osm_data (readosm_file * input, unsigned int sz,
     int ok_header = 0;
     int hdsz = 0;
     size_t rd;
-    unsigned char *buf = malloc (sz);
+    unsigned char *buf = XMALLOC (sz);
     unsigned char *base = buf;
     unsigned char *start = buf;
     unsigned char *stop = buf + sz - 1;
@@ -2145,7 +2145,7 @@ parse_osm_data (readosm_file * input, unsigned int sz,
     if (!ok_header || !hdsz)
 	goto error;
 
-    buf = malloc (hdsz);
+    buf = XMALLOC (hdsz);
     base = buf;
     start = buf;
     stop = buf + hdsz - 1;
@@ -2171,7 +2171,7 @@ parse_osm_data (readosm_file * input, unsigned int sz,
 	    {
 		/* found an uncompressed block */
 		raw_sz = variant.length;
-		raw_ptr = malloc (raw_sz);
+		raw_ptr = XMALLOC (raw_sz);
 		memcpy (raw_ptr, variant.pointer, raw_sz);
 	    }
 	  if (variant.field_id == 2 && variant.type == READOSM_VAR_INT32)
@@ -2191,7 +2191,7 @@ parse_osm_data (readosm_file * input, unsigned int sz,
     if (zip_ptr != NULL && zip_sz != 0 && raw_sz != 0)
       {
 	  /* unZipping a compressed block */
-	  raw_ptr = malloc (raw_sz);
+	  raw_ptr = XMALLOC (raw_sz);
 	  if (!unzip_compressed_block (zip_ptr, zip_sz, raw_ptr, raw_sz))
 	      goto error;
       }
diff --git a/src/readosm.c b/src/readosm.c
index af0af71649cde74ba60e6c7bacced11d82382452..5324d9b4fa7a04cf43a8ee464bed7f4b8e76d859 100644
--- a/src/readosm.c
+++ b/src/readosm.c
@@ -61,6 +61,12 @@
 #define strcasecmp	_stricmp
 #endif /* not WIN32 */
 
+void *
+xmalloc (size_t sz, char *file, int line)
+{
+    return malloc (sz);
+}
+
 static int
 test_endianness ()
 {
@@ -79,7 +85,7 @@ static readosm_file *
 alloc_osm_file (int little_endian_cpu, int format)
 {
 /* allocating and initializing the OSM input file struct */
-    readosm_file *input = malloc (sizeof (readosm_file));
+    readosm_file *input = XMALLOC (sizeof (readosm_file));
     if (!input)
 	return NULL;
     input->magic1 = READOSM_MAGIC_START;