changeset 18561:7de648f42bc0

lib-fts: Snowball's sb_stemmer_stem() can only fail because it runs out of memory.
author Timo Sirainen <tss@iki.fi>
date Sat, 09 May 2015 11:33:45 +0300
parents b0a934361563
children cfa35069876b
files src/lib-fts/fts-filter-stemmer-snowball.c
diffstat 1 files changed, 12 insertions(+), 7 deletions(-) [+]
line wrap: on
line diff
--- a/src/lib-fts/fts-filter-stemmer-snowball.c	Sat May 09 11:17:03 2015 +0300
+++ b/src/lib-fts/fts-filter-stemmer-snowball.c	Sat May 09 11:33:45 2015 +0300
@@ -81,20 +81,25 @@
 fts_filter_stemmer_snowball_filter(struct fts_filter *filter,
                                    const char **token)
 {
-	const sb_symbol *base;
-	int len;
 	struct fts_filter_stemmer_snowball *sp =
 		(struct fts_filter_stemmer_snowball *) filter;
+	const sb_symbol *base;
 
-	if (sp->stemmer == NULL)
+	if (sp->stemmer == NULL) {
 		if (fts_filter_stemmer_snowball_create_stemmer(sp) < 0)
 			return -1;
+	}
 
 	base = sb_stemmer_stem(sp->stemmer, (const unsigned char *)*token, strlen(*token));
-	len = sb_stemmer_length(sp->stemmer);
-	*token = t_strdup_until(base, base + len);
-
-	return *token != NULL? 1: -1;
+	if (base == NULL) {
+		/* the only reason why this could fail is because of
+		   out of memory. */
+		i_fatal_status(FATAL_OUTOFMEM,
+			       "sb_stemmer_stem(len=%"PRIuSIZE_T") failed: "
+			       "Out of memory", strlen(*token));
+	}
+	*token = t_strndup(base, sb_stemmer_length(sp->stemmer));
+	return 1;
 }
 
 #else